当n较大时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但比直接插入排序的最好情况要差,所以当元素初始序列已经接近升序时,直接插入排序比二分插入比较次数少。
1 #include <stdio.h> 2 3 4 // 分类 -------------- 内部比较排序 5 6 // 数据结构 ---------- 数组 7 8 // 最差时间复杂度 ---- O(n^2) 9 10 // 最优时间复杂度 ---- O(nlogn) 11 12 // 平均时间复杂度 ---- O(n^2) 13 14 // 所需辅助空间 ------ O(1) 15 16 // 稳定性 ------------ 稳定 17 18 19 20 void InsertSortDichotomy( int A[], int n ) 21 { 22 int i, j, get, left, mid, right; 23 for( i = 1; i < n; i++ ) // 类似抓扑克牌排序 24 { 25 left = 0; // 拿在左手上的牌总是排序好的,所以可以用二分法 26 right = i - 1; // 手牌左右边界进行初始化 27 get = A[i]; // 右手抓到一张扑克牌 28 29 while( left <= right ) // 采用二分法定位新牌的位置 30 { 31 mid = (left + right)/2; 32 if( A[mid] > get ) 33 right = mid - 1; 34 else 35 left = mid + 1; 36 } 37 38 for(j = i-1; j >= left; j--) // 将欲插入新牌位置右边的牌整体向右移动一个单位 39 { 40 A[j+1] = A[j]; 41 } 42 A[left] = get; // 将抓到的牌插入手牌 43 } 44 } 45 46 int main() 47 { 48 int A[] = { 8, 5, 2, 6, 9, 3, 1, 4, 0, 7 }; // 从小到大插入排序 49 int n = sizeof(A) / sizeof(int); 50 51 InsertSortDichotomy( A, n ); 52 53 int i; 54 printf("二分插入排序结果:"); 55 for( i = 0; i < n; i++ ) 56 { 57 printf("%d ", A[i]); 58 } 59 printf("\n"); 60 61 return 0; 62 }