从二分查找到折半插入排序

目录

  • 从二分查找到折半插入排序
  • 折半插入排序性能
  • Code

从二分查找到折半插入排序

回忆直接插入排序的过程,发现每趟排序中进行了两个动作:

\1. 从左边的已排序序列中找寻插入位置。

\2. 给插入位置腾出空间,将插入元素复制到表中的插入位置。

步骤一在直接插入排序中是一个“Linear Search”顺序查找过程,而我们知道二分查找比顺序查找更优秀

折半插入排序性能

  • Space Complexity: S(n)=O(1)
  • Time Complexity: T(n)=O(\(n^2\))
  • 一种稳定的排序

因为折半排序仅仅减少了比较元素的次数,约为\(O(nlog_2n)\),而移动次数并未改变。折半插入排序的复杂度仍为\(O(n^2)\)。

Code

code 1 (选取自GeeksforGeeks)结构清晰

int binarySearch(int a[], int item, int low, int high)
{
    if (high <= low)
        return (item > a[low])?  (low + 1): low;

    int mid = (low + high)/2;

    if(item == a[mid])
        return mid+1;

    if(item > a[mid])
        return binarySearch(a, item, mid+1, high);
    return binarySearch(a, item, low, mid-1);
}

void insertionSort(int arr[], int n)
{
    int i, loc, j, k, selected;

    for (i = 1; i < n; ++i)
    {
        j = i - 1;
        selected = a[i];

        // find location where selected sould be inseretd
        loc = binarySearch(a, selected, 0, j);

        // Move all elements after location to create space
        while (j >= loc)
        {
            a[j+1] = a[j];
            --j;
        }
        a[j+1] = selected;
    }
}

code 2(教材版本改)

int i, key, j, low, high, mid;

for (i = 1; i < n; ++i)
{
    key = a[i];     //保存待排序元素的值
    j = i - 1;          //从待排序元素的前一个开始
    //二分查找部分
    low = 0;
    high = j;

    while (low <= high)
    {
        mid = low + (high - low) / 2;
        if (a[mid] > key)
            high =  mid - 1;
        else low = mid + 1;     //小于或者等于low为mid右位置
    }
    // Move all elements after location to create space
    while (j >= low)
    {
        a[j+1] = a[j];
        --j;
    }
    a[j+1] = key;
}

原文地址:https://www.cnblogs.com/goodswarm/p/11684144.html

时间: 2024-10-08 09:07:03

从二分查找到折半插入排序的相关文章

二分查找 (折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构          2.必须按关键字大小有序排列. [优缺点]折半查找法的优点是比较次数少,查找速度快,平均性能好;             其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于 不经常变动而 查找频繁的有序列表. [算法思想]首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:                              否则利用中

【1】二分查找(折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法.  [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * * @author Administrator * */ public static void main(String[] args) { int[] src = new int[] { 1, 3, 5, 7, 8, 9 };

二分查找(折半查找)C++

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功: 否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表. 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查

二分查找or折半查找

1 package com.gxf.search; 2 3 /** 4 * 测试折半查找or二分查找 5 * @author xiangfei 6 * 7 */ 8 public class BiSearch { 9 10 /** 11 * 非递归实现,从第1个元素开始查找 12 * @param array 13 * @param k 14 * @return 0 查找失败 15 */ 16 public int biSearch(int array[], int k){ 17 int low

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

基于二分查找(折半查找)的时间范围匹配

需求介绍 1.有dateLeft和dateRight两个txt文件 dateLeft.txt dateRight.txt 左边的表时间比较紧凑,每秒都有:右边的表时间比较分散,间隔都是几分钟 2.需要从Left表中取出一行,匹配属于Right表中属于哪一行的时间范围 例如 2017-08-21 11:44:40.838 人为观察是更接近Right表的第二行-11:44:44:154等 写出程序从左边找出右边所属时间的行,然后获取它的run=? 3.算法实现 1.通过两层循环遍历匹配,算出每次匹配

数据结构50:二分查找法(折半查找法)

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序:{5,13,19,21,37,56,64,75,80,88,92}. 在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需

二分查找(折半查找)

二分查找条件:有序数组. 查找原理:查找过程从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束: 如果某一特定元素大于或小于中间元素,则在数组大于或小于中间原色的那一半中查找,而且跟开始一样从中间元素开始比较. 如果在某一步骤数组为空,则代表找不到. 这种搜索算法每一次比较都使搜索范围缩小一半. 时间复杂度:O(logn) 使用二分查找有两个前提条件: 1,待查找的列表必须有序. 2,必须使用线性表的顺序存储结构来存储数据. 下面是实现代码. C#版: namespace B

二分查找法优化插入排序

通俗的插排是对一个整型数组进行升序排序,可以看出每个元素插入到队列中经过两个步骤:先是挨个比较,找到自己所在的位置:然后把后面的数据全部移位,然后把元素插入. 要把数据插入,移位是必不可少了.那么,挨个比较倒是可以优化,因为要插入的队列已经是排序好的,我们可以使用二分法来减少比较的次数. 二分法的时间复杂度为O(log 2 n),而线性查找的复杂度为O(n). 在对50000个随机数进行测试比较中,发现加了二分查找的插排比普通的插排速度快了将近一倍!(通俗插排7888ms,优化插排4852ms)