插入排序不适合对于数据量比较大的排序应用。如果数据量很小,比如量级小于千,插入排序还是一个不错的选择。
1 /* 2 3 1.从第一个元素开始,该元素可以认为已经被排序 4 5 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 6 7 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 8 9 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 10 11 5.将新元素插入到该位置后 12 13 6.重复步骤2~5 14 15 */ 16 #include <stdio.h> 17 18 19 // 分类 -------------- 内部比较排序 20 21 // 数据结构 ---------- 数组 22 23 // 最差时间复杂度 ---- 最坏情况为输入序列是降序排列的,此时时间复杂度O(n^2) 24 25 // 最优时间复杂度 ---- 最好情况为输入序列是升序排列的,此时时间复杂度O(n) 26 27 // 平均时间复杂度 ---- O(n^2) 28 29 // 所需辅助空间 ------ O(1) 30 31 // 稳定性 ------------ 稳定 32 33 34 35 void InsertSort( int A[], int n ) 36 { 37 int i, j, get; 38 for( i = 0; i < n; i++ ) // 类似抓扑克牌排序 39 { 40 get = A[i+1]; // 右手抓到一张扑克牌 41 j = i; // 拿在左手上的牌总是排序好的 42 while( j >= 0 && A[j] > get ) // 将抓到的牌与手牌从右向左进行比较 43 { 44 A[j+1] = A[j]; // 如果该手牌比抓到的牌大,就将其右移 45 j--; 46 } 47 A[j+1] = get; // 直到该手牌比抓到的牌小(或二者相等),将抓到的牌插入到该手牌右边(相等元素的相对次序未变,所以插入排序是稳定的) 48 } 49 } 50 51 int main() 52 { 53 int A[] = { 8, 5, 2, 6, 9, 3, 1, 4, 0, 7 }; // 从小到大插入排序 54 int n = sizeof(A) / sizeof(int); 55 56 InsertSort( A, n ); 57 58 int i; 59 printf("插入排序结果:"); 60 for( i = 0; i < n; i++ ) 61 { 62 printf("%d ", A[i]); 63 } 64 printf("\n"); 65 66 return 0; 67 }