zoukankan      html  css  js  c++  java
  • 二分插入排序

    当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 }
  • 相关阅读:
    汇编学习笔记(3)[bx]和loop
    C++面试题-概念篇(一)
    命名空间的冷思考
    背包以及装备模块封装的思考
    虚函数,纯虚函数以及虚继承
    组件化开发在游戏开发当中的思考和汇总
    Netty和MINA之间的比较思考
    学习C++与Java之间的区别
    C++服务器年前总结
    C++Builder如何将当前时间与字符串相互转换
  • 原文地址:https://www.cnblogs.com/itsad/p/7865852.html
Copyright © 2011-2022 走看看