插入排序:
以下面的数组arry 为例:
90 ,41 ,57 ,71 ,93 ,29 ,35 ,14 ,64 ,16
先以arry[0]为基准。
外层第一次循环:
定义临时变量temp = arry[1] = 41
第一次比较:
arry[1]与temp进行比较,arry[0]>temp,比较结果为:
90 ,90 ,57 ,71 ,93 ,29 ,35 ,14 ,64 ,16
然后将temp的值赋予arry[0],结果为:
41 ,90 ,57 ,71 ,93 ,29 ,35 ,14 ,64 ,16
外层第二次循环
定义临时变量temp = arry[2] = 57
第一次比较:
arry[1]与temp进行比较,arry[1]>temp,比较结果为:
41 ,90 ,90 ,71 ,93 ,29 ,35 ,14 ,64 ,16
第二次比较:
arry[0]与temp进行比较,arry[0]<temp,结果不变:
41 ,90 ,90 ,71 ,93 ,29 ,35 ,14 ,64 ,16
然后将temp的值赋予arry[1],结果为:
41 ,57 ,90 ,71 ,93 ,29 ,35 ,14 ,64 ,16
外层第三次循环
定义临时变量temp = arry[3] = 71
第一次比较:
arry[2]与temp进行比较,arry[2]>temp,比较结果为:
41 ,57 ,90 ,90 ,93 ,29 ,35 ,14 ,64 ,16
第二次比较:
arry[1]与temp进行比较,arry[1]<temp,结果不变:
41 ,57 ,90 ,90 ,93 ,29 ,35 ,14 ,64 ,16
第三次比较:
arry[0]与temp进行比较,arry[0]<temp,结果不变:
41 ,57 ,90 ,90 ,93 ,29 ,35 ,14 ,64 ,16
然后将temp的值赋予arry[2],结果为:
41 ,57 ,71 ,90 ,93 ,29 ,35 ,14 ,64 ,16
…
外层第五次循环:
定义临时变量temp = arry[5] = 29
第一次比较:
arry[4]与temp进行比较,arry[4]>temp,比较结果为:
41 ,57 ,71 ,90 ,93 ,93 ,35 ,14 ,64 ,16
第二次比较:
arry[3]与temp进行比较,arry[3]>temp,比较结果为:
41 ,57 ,71 ,90 ,90 ,93 ,35 ,14 ,64 ,16
…
第五次比较:
arry[0]与temp进行比较,arry[0]>temp,比较结果为:
41 ,41 ,57 ,71 ,90 ,93 ,35 ,14 ,64 ,16
然后将temp的值赋予arry[0],结果为:
29 ,41 ,57 ,71 ,90 ,93 ,35 ,14 ,64 ,16
…
最后结果为:
14 ,16 ,29 ,35 ,41 ,57 ,64 ,71 ,90 ,93
思想:
设置监视岗临时变量temp,将待插入的值赋予temp。设定开始查找的位置j,在数组中搜索,如果j-1位置上的数字比temp大,则将j位置上的值付给j-1,将数组向后推移,直到找到比temp小的数值,将值赋予j-1上。
代码实现如下:
public static void sort(int arr[]) {
int j;
for (int p = 1; p < arr.length; p++) {
int temp = arr[p];
for (j = p; j > 0 && temp < arr[j - 1]; j--) {
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
假设数组的长度为n,内层循环的次数为:
1+2+3+…+n-1=n(n-1)/2
该算法的时间复杂度为O(n^2)
空间复杂度为O(1).