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

      在直接插入排序中,需要将待排序的元素与有序区间中的元素一一比较,直到找到插入位置,因此,直接插入排序虽然简单易懂,但是效率很低,

    元素比较的次数很多。为了减少元素的比较次数,我们在查找待排序元素的插入位置时,在有序区间内采用折半查找,这也就是二分插入排序的由来。

    如果不明白我所说的“有序区间”是怎么回事的话,可以参见上一篇文章http://www.cnblogs.com/greedyco/p/7134572.html。

      二分插入排序的要点就是采用折半查找,来找到待排序元素的插入位置,然后移动元素,将待排序的元素插入序列中。

      算法实现如下:

      

    #include <stdio.h>
    #include <stdlib.h>
    
    void BinInsertSort(int A[], int n)
    {
        int i, j, low, mid, high, temp;
        for(i = 1; i <= n-1; i++)
        {
            temp = A[i];                    // 辅助变量temp用来保存待排序的元素
            low = 0;
            high = i-1;                     // 有序区间为[0,i-1]
            while(low <= high)              // 在有序区间内采用折半查找,找到插入位置
            {
                mid = (low + high)/2;
                if(A[mid] > temp)
                    high = mid - 1;
                else
                    low = mid + 1;
            }
            for(j = i-1; j >= high+1; j--)  // 移动元素,腾出空间
                A[j+1] = A[j];
            A[high+1] = temp;               // 将待排序的元素插入
        }
    }

      相比直接插入排序,虽然二分插入排序大大减少了元素的比较次数,但是元素的移动次数并没有减少,因此该算法并没有从本质上提高算法的性能,

    二分插入排序的时间复杂度仍为O(n2),空间复杂度为O(1)。

  • 相关阅读:
    卫星时间同步装置的安装及售后
    windowsU盘重装系统:操作流程
    vue安装正确流程
    win10以太网未识别的网络
    [UnityShader]unity中2D Sprite显示阴影和接受阴影
    [UnityShader]说厌了的遮挡显示
    [Unity]利用Mesh绘制简单的可被遮挡,可以探测的攻击指示器
    ConcurrentHashMap源码解读
    Vector底层原理
    LinkedList集合底层原理
  • 原文地址:https://www.cnblogs.com/greedyco/p/7147744.html
Copyright © 2011-2022 走看看