直接插入排序-Straight Insert Sort
1:算法介绍
这是自己写的第一个算法简单的排序算法:直接插入排序。插入排序时最简单的排序算法,能够对少量元素进行快速的排序。
1.1: 算法特征
算法的时间复杂度是O(n2).空间复杂度是O(1)。插入算法属于原地(In-place)、稳定排序算法的一种。
2:算法基本思想
在排好子数组A[1..j-1]后,将A[j]插入,形成排序好的子数组A[1..j].
插入排序的数据集合分为两部分,第一部分是已经排序好的数据集合;第二部分是待排序的数据集合。每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。最终返回的是排序好的数据集合。
根据寻找插入位置的方法不同,插入排序分为直接插入排序,折半插入排序(二分插入排序),希尔排序。它们都属于稳定排序的算法,即两个相等的关键字在排序后不会交换位置。
2.0:复杂度分析
如果是升序排列,那么最好情况下,数组已经排序好,此时只需要比较的次数为n-1次。最坏情况下,数组是逆序排列,A[i]需要比较i-1次才能插入到有序表中。而对应的赋值操作位i-2次,因此最终的比较次数为n(n-1)/2,而赋值次数为n(n-1)/2 -(n-1).
综上,插入排序的时间复杂度为O(n2),因为算法是原地排序,只需要一个临时存储空间,故空间复杂度为O(1)。
2.1 直接插入排序 - Straight Insert Sort
伪代码:
输 入:A[0..n-1]
step1: 初始化-- 有序表A[0], 无序表A[1..n-1], i为1(不是0)
step2: 循 环-- 查找A[i]插入到A[0..i-1]中的正确位置,形成新的有序表A[0..i]
step3: i++,转到step2,直到i=n-1;
源代码:


1 /** 2 *算法:插入排序 3 *输入:n个数<a1, a2,..., an> 4 *输出:输入序列的一个排列<a1', a2', ..., an'> 使得a1'《 a2'《 ...《 an' 5 6 *作者:rainbow 7 *时间:2013-04-20 8 **/ 9 #include <stdio.h> 10 #define Length 10 11 12 void printArray(int A[], int len) 13 { 14 int i; 15 16 for(i = 0; i < len - 1; i++) 17 { 18 if(i < len -1) printf("%d ", A[i]); 19 } 20 21 printf("%d\n", A[i]); 22 } 23 24 //插入排序 25 void directInsertSort(int A[], int len) 26 { 27 int i,j; 28 int temp = 0; 29 30 for(i = 1; i < len; i++) 31 { 32 //待排序元素 33 temp = A[i]; 34 35 //寻找插入位置 36 for(j = i -1 ; j >= 0; j--) 37 { 38 //如果当前元素比temp大,将它的值向后移动 39 //为temp提供插入位置 40 if( A[j] > temp ) A[j+1] = A[j]; 41 else break; 42 } 43 44 //最终的插入位置为j+1,因为A[j] <= temp. 45 A[j+1] = temp; 46 } 47 } 48 49 int main() 50 { 51 int A[Length] = {9,8,7,6,5,4,3,2,1,0}; 52 53 printf("The data before direct insert sort is:\n"); 54 printArray(A, Length); 55 56 directInsertSort(A, Length); 57 58 printf("\nThe data after direct insert sort is:\n"); 59 printArray(A, Length); 60 return 0; 61 }
运行结果: