zoukankan      html  css  js  c++  java
  • 折半插入排序

    折半插入排序是插入排序的一种,是对直接插入排序寻找插入位置的优化,减少了比较元素的次数,比较次数的时间复杂度是O(nlog2n),下面是插入排序的一些特征:

    • 平均时间复杂度:O(n^2)
    • 最坏情况:O(n^2)
    • 最好情况:O(n)
    • 空间复杂度,最好最坏平均都为:O(1)
    • 是否稳定:稳定

    第k次排序后,前k个或k+1个元素有序,但可能不是最终位置

    折半插入的基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
    折半插入排序先用折半查找法找到插入位置,然后将其后的元素都后移一个位置,再插入进去。

    下面是折半插入排序的代码:

    /**
    * arr 数组首地址
    * len 数组长度
    */
    void insert_sort1(int *arr, int len)
    {
        int i, j, low, high, mid;
        for (i=1; i<len; i++) {
            if (arr[i] < arr[i-1]) {
                int temp = arr[i];
                low = 0;
                high = i-1;
                while (low<=high) {         // 查找插入位置
                    mid = (low+high)/2;
                    if (arr[mid] > temp)
                        high = mid - 1;
                    else
                        low = mid + 1;
                }
                for (j=i-1; j>=high+1; --j) // 后移元素
                    arr[j+1] = arr[j];
                arr[high+1] = temp;
            }//if
        }//for
    }
    

    测试代码,可直接复制后编译执行:

    #include <stdio.h>
    
    void show(int *arr, int len);
    void insert_sort1(int *arr, int len);
    
    int main()
    {
        int len = 7;
        int arr[] = {7, 10, 11, 9, -8, 2, 27};
        insert_sort1(arr, len);
        show(arr, len);
        return 0;
    }
    
    /**
    * arr 数组首地址
    * len 数组长度
    */
    void show(int *arr, int len)
    {
        int i;
        for (i=0; i<len; i++) {
            printf("%4d", arr[i]);
        }
        printf("
    ");
    }
    
    /**
    * arr 数组首地址
    * len 数组长度
    */
    void insert_sort1(int *arr, int len)
    {
        int i, j, low, high, mid;
        for (i=1; i<len; i++) {
            if (arr[i] < arr[i-1]) {
                int temp = arr[i];
                low = 0;
                high = i-1;
                while (low<=high) {
                    mid = (low+high)/2;
                    if (arr[mid] > temp)
                        high = mid - 1;
                    else
                        low = mid + 1;
                }
                for (j=i-1; j>=high+1; --j)
                    arr[j+1] = arr[j];
                arr[high+1] = temp;
            }//if
        }//for
    }
    
  • 相关阅读:
    Django admin的一些有用定制
    django后台中如何在result_list内优雅的显示及使用过滤器?
    DataFrame 的函数
    pandas的替换和部分替换(replace)
    HTML5中的Web Notification桌面右下角通知功能的实现
    sqlalchemy 实现select for update
    SQLAlchemy 使用经验 (查询 事务 锁表)
    concat()
    某数据防泄漏 越权修改管理员密码
    齐治堡垒机 远程命令执行漏洞[CNVD-2019-20835]
  • 原文地址:https://www.cnblogs.com/qijinzhi/p/insert_sort1.html
Copyright © 2011-2022 走看看