插入排序
插入排序可以分为两种:一是直接插入排序,二是希尔排序。接下来主要说的直接插入排序
算法思想
它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
算法实现
直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。对于一个无序序列arr{7,6,9,3,1,5,2,4}来说,我们首先先确定首元素7是有序的,然后在无序序列中向右遍历,6小于7则它插入到7的前面,再继续遍历到9,9大于7则插入到7的后面,这样继续直到得到有序序列{1,2,3,4,5.,6,7,9}。
过程图示
我们就上述的实例来进行演示。
第一轮,当前有序的序列是7,我们找到无序序列中的首元素6,与7进行比较。小于7,所以放在7的前面
第二轮,当前有序的序列是6,7,我们找到无序序列中的首元素9,与7进行比较。大于7,所以放在7的后面
第三轮,当前有序的序列是6,7,9,我们找到无序序列中的首元素3,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,所以放在6的前面
第四轮,当前有序的序列是3,6,7,9,我们找到无序序列中的首元素1,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,与3进行比较。小于3,所以放在3的前面,
第五轮,当前有序的序列是1,3,6,7,9,我们找到无序序列中的首元素5,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,所以放在6的前面
好了,接下来的就不再去进行排序了。
https://www.processon.com/view/link/60bec41ff346fb29e3ed582b可以访问这个网站就可以看到完整的图片实例了。
代码演示
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101,34,119,1,-1,89};
int len = arr.length;
for(int i = 1;i < len;i++)
{
// temp 用来保存当前要进行排序的元素
int temp = arr[i];
int j;
//j = i-1: temp的前一个元素,
//j >= 0: 避免数组越界
for(j = i-1;j >= 0 && temp < arr[j];j--)
{
//将大的元素后移,与temp交换位置
arr[j+1] = arr[j];
}
//将进行排序的元素插入到有序序列中(此时经历的一次j--,j = -1)
arr[j+1] = temp;
}
System.out.println(Arrays.toString(arr));
}
}