(一)什么是插入排序呢?
插入排序就是每次把待排序的数据一个数据插入到已经排好序的正确位置。就好比,你左手拿着扑克牌,用右手去取牌的时候,把取到的牌放到左手正确的位置。
比如我们要排序4,3,5,7,6,2,1,9,88,0。
(1)我们先假设下标为0的数据是排好的,即4是排好序的
那么接下来就要3,5,7,6,2,1,88,0.中每次取出一位放到数组的正确位置。
(2)取3的时候,3< 4,所以3放到4的前面
(3)取5的时候,5>4,所以放到4后面
(4)取7的时候,7>5,所以7放到5后面
(5)取6的时候,5<6<7,所以6放到7的前面,5的后面
(6)取2的时候,2比(7,6,5,4,3)都小,所以放到3前面
(7)取1的时候,1比(7,6,5,4,3,2)都小,所以放到2前面
以此类推,剩下的两个就不画图了
(二)代码如下:
public class ChaRu {
public static void main(String args[]) {
int a [] = {4,3,5,7,6,2,1,9,88,0};
sort(a);
System.out.print("结果为"+ a[0]+","+a[1]+","+a[2]+","+a[3]+","+a[4]+","+a[5]+","+a[6]+","+a[7]+","+a[8]+","+a[9]);
}
public static void sort(int s []){
int start = 1;//index = 0 的默认排好了的。
//i代表初始吭位置 - 趟数
for(int i = start; i<s.length; i++){//设定数组的第一个元素是排序好的
int j = i;
int temp = s[i];//把s[i]赋给中间变量,相当于把s[i]挖空,等找到合适的元素再把元素插入这个位置
while(j > 0 && s[j-1] > temp){// r如果元素比中间值大,则移动位置
s[j] = s[j-1];
j--;//不断和排好序的元素比较, 此时的坑index
}
s[j] = temp;//每次循环后把坑填好
}
//System.out.print("结果为"+ s);
}
}
(三)现在来分析一下插入排序的时间复杂度:
在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... + (N - 1),等差数列求和,结果为 N^2 / 2,所以最坏情况下的复杂度为 O(N^2)。
最好情况下,数组已经是有序的,每插入一个元素,只需要考查前一个元素,因此最好情况下,插入排序的时间复杂度为O(N)