插入排序
主要用途
插入排序适用于少量元素的排序。时间复杂度 空间复杂度
过程分析
这里我们主要通过图解的方式详述插入排序的过程:见下图
这里选择 序列 {3,1,2,4,6,5 }作为初始序列,图中阴影部分表示下次要插入的序列中的元素。
1、原始序列中选择第一个元素作为初始序列,此例中3为初始序列,1为要插入的元素
2、首先比较1与3的大小,可以从图2 中看出由于1小于3,所以3向后移动1位,1插入当前位置即可。
3、从图2到图3的过程中,2首先跟3比较大小,由于2小于3,所以3向后移动1位,然后比较2与1的大小,2大于1所以 不必再向前比较大小(因为1在它左边的队列中已经是最 大的元素)。2插入到当前的位置即可。
4、依次类推知道整个队列排序完。
插入排序代码
C语言代码
#include"stdio.h"
insert_sort(int *array,int length){
int i,j,key = 0;
for(i = 1; i < length; i++){
key = array[i];
j = i-1;
while( j>=0 && array[j] > key){
if(array[j] > key){
array[j+1] = array[j];
}
j--;
}
array[j+1] = key;
}
}
int main(){
int array[] = {3,1,2,4,6,5},length = 0,i;
length = sizeof(array)/sizeof(array[0]);
insert_sort(array,length);
for(i = 0;i<length;i++){
printf("%d ",array[i]);
}
return 0;
}
Java代码
public class insertSort {
public static void insert_sort(Integer... array){
for(int i = 1,j,key; i < array.length; i++){
key = array[i];
j = i-1;
while(j>=0 && array[j] > key){
if(array[j] > key){
array[j+1] = array[j];
}
j--;
}
array[j+1] = key;
}
for(int i = 0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
public static void main(String[] args){
Integer[] array={3,1,2,4,6,5};
insert_sort(array);
}
}
算法分析
时间复杂度分析
这里根据算法导论中提供的思路:舍每条语句执行的时间代价为c,次数为n。
只考虑核心部分代码的时间复杂度: 代价 次数
for(i = 1; i < length; i++){ c1 n
key = array[i]; c2 n-1
j = i-1; c3 n-1
while( j>=0 && array[j] > key){ c4 sum(t(i))(2~n)
if(array[j] > key){ c5 sum(t(i)-1)(2~n)
array[j+1] = array[j]; c6 sum(t(i)-1)(2~n)
}
j--; c7 sum(t(i)-1)(2~n)
}
array[j+1] = key; c8 n-1
}
T(n) = c1*n+c2*(n-1)+c3*(n-1)+c4*(sum(t(i))(2~n))+c5*(sum(t(i)-1)(2~n))+c6*(sum(t(i)-1)(2~n))+c7*(sum(t(i)-1)(2~n))+c8*(n-1);
经过整理:
最佳情况 :a*n -b
最坏情况:a*n^2+b*n+c
空间复杂度分析