<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">插入排序,简而言之,就是对于第i个数,前i-1个数是已排序的,第i个数则要从第i-1个数开始往前遍历,比较大小,比它大的往后移一位,比它小的则其后为要的插入的位置,则在此处插入即可。插入后会发现前i个数都变成已排序的了(此处应注意体会)。于是依此类推插入第i+1个数。此方法最坏的时间复杂度也会达到O(n^2)的。</span>
例如初始序列:
34 8 64 51 3221
第一趟插入:8 34 64 51 3221 (默认第一个数是有序的,则待插入的是第二个数8,显然8小于第一个数,因此插入在34的前面)
第二趟插入:8 34 64 51 3221 (此时前两个数是有序的,则带插入的是第三个数64,显然34比64要小,则无需插入)
第三趟插入:8 34 51 64 3221 (此时前三个数是有序的,则带插入的是第四个数51,显然51比64要小,比34大,则插入至34和64之间)
第四趟插入:8 32
34 51 6421
(此时前四个数是有序的,则带插入的是第五个数32,显然32比34要小,比8大,则插入至34和8之间)
第五趟插入:8 21
32 34 5164
(此时前五个数是有序的,则带插入的是第六个数21,显然21比32要小,比8大,则插入至32和8之间)
五趟插入后,整个序列都是有序的了。因此n个数,至少需要n-1趟插入。
算法实现:
/*直接插入排序法*/ #include<stdio.h> void InsertSort(int *data,int N); int main() { int i=0; int data[6]={34,8,64,51,32,21}; printf("Before Sort:\n"); for(i=0;i<6;i++) { printf("%d\t",data[i]); } InsertSort(data,6); printf("\nAfter Sort:\n"); for(i=0;i<6;i++) { printf("%d\t",data[i]); } return 0; } void InsertSort(int *data,int N) { int i=0,j=0; int tmp=0; for(i=1;i<N;i++) { tmp=data[i];//待插入的值 for(j=i;j>0 && data[j-1]>tmp;j--)//在已排序数组中从后往前遍历,直到找到插入的位置j data[j]=data[j-1]; data[j]=tmp; } }
原文:http://blog.csdn.net/u010275850/article/details/45310259