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)。

  • 相关阅读:
    object对象
    addEventListener 和 attachEvent
    BOM常用对象
    动态原型
    鼠标移动图片放大效果(兼容IE8、多图)
    伪元素:before和:after
    javascript/js 判断是否安装flash player插件,提示安装方法。
    Form表单值转换为[{name:'',value}]键值对
    [转][网站、云服务与虚拟机]弄清负载均衡的机制
    C# Lazy Initialization
  • 原文地址:https://www.cnblogs.com/greedyco/p/7147744.html
Copyright © 2011-2022 走看看