首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

经典算法——折半插入排序

什么是算法? 2. 算法的效率 3. 折半插入排序 3.1 折半插入排序介绍 3.2 代码实践 3.3 算法效率 1. 什么是算法?...常见排序算法的稳定性:堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。 3....折半插入排序 3.1 折半插入排序介绍 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。...与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了 折半查找/二分查找 。...所以,折半插入排序和插入排序的时间复杂度相同都是O(N2)。 在减少了比较次数方面它确实相当优秀,所以该算法仍然比直接插入排序好。

37510

经典算法折半插入排序

折半插入排序 排序含义 了解一个知识,必须先要从其含义开始。 折半插入排序,又称二分法插入排序。是由折半(二分法)排序和插入排序两种排序算法组合而成。...折半(二分法)排序和插入排序不了解的同学可以先看看主页的两篇文章。 接下来,仍是用一个小例子解释折半插入排序是如何排序的。...首先,先找到C合适的位置,使用折半查找,另left左边界等于零,右边界right等于已知排好序的长度值减一,也就是循环的次数-1;然后获取其边界中间值后判断key值(需要插入的元素的值)与中间值的大小关系...} arr[right+1]=key; 若是需要插入,就需要从最右侧开始,交换相邻元素位置,最后将元素插入到指定位置,具体实现方法为插入排序(插入排序算法具体由主页另一篇经典算法插入排序文章...) 总结 学习折半二分法查找,到插入排序,在到折半插入排序,内容算法复杂度一点点的递增。

17420
您找到你想要的搜索结果了吗?
是的
没有找到

基础算法|6 折半插入排序 - HDU 1412

本篇我们将学习又一种排序算法——折半插入排序算法,跟上篇我们所学习的快速排序有点像,都是建立在我们之前学习的算法的基础上改进而来的。...从这个算法的名字中大概就能知道它是建立在哪个算法的基础之上的,没错,就是折半(二分)查找和直接插入排序。...---- 折半插入排序 我们知道,直接插入排序我们是通过顺序查找(即逐个元素逐一比较)然后找到待插入元素的位置,而我们之前学习了一种效率较高的查找算法——二分(折半)查找,而且我们需要进行查找的表又是有序的...---- 折半插入排序的算法思想 通过将直接插入排序的顺序查找更换为效率更高的二分查找,以提高排序算法的效率。...---- 折半插入排序的实现过程 为了适应插入排序,我们需要对之前的二分查找做一些改进。插入排序每次的有序序列的长度并不为原序列的长度,而是从长度为1(只有a[0]一个元素)到原序列的长度n。

61640

插入排序算法:直接排序与折半排序

排序算法大概可以分为五种:插入排序,交换排序,选择排序,归并排序和计数排序。 这篇文章讨论一下,插入排序中的直接插入折半插入。 排序,归根结底它的作用是对表中的记录进行一个有序的归纳。...先来看一下插入排序的算法: /直接插入排序/ void Straight_Insert_Sort(Sqlist &L) { int j; for (int i = 2; i <= L.length...下面来看一下折半插入算法: /*折半插入排序*/ void B_Insert_Sort(Sqlist &L) { int i, j, low, mid, high; for (i...不同的地方是,这里利用折半查找,找到,插入记录的位置,需要注意的是,为什么high+1就是应该插入关键字的位置呢?...key; j--) { L.R[j + 1] = L.R[j]; } L.R[j + 1] = L.R[0]; } } /*折半插入排序

60820

7.2.2 插入排序之折半插入排序

注意到该算法中,总是边比较边移动元素,下面将比较和移动操作分离出来,即先折半查找出元素的待插入位置,然后再统一地移动待插入位置后的所有元素。...当排序表为顺序存储的线性表时,可以对直接插入排序做如下改造: 由于是顺序存储的线性表,所以查找有序子表时可以用折半查找来实现。 在确定出待插入位置后,就可以统一地后移元素了。...} A[high+1]=A[0];//插入操作 } } 折半插入排序仅仅减少了比较元素的次数...,约为O(nlog2 N),该比较次数与待排序表的初始状态无关,仅取决于表中的元素的个数n; 而元素的移动次数没有改变,它依赖于待排序表的初始状态,因此折半插入排序的时间复杂度仍为O(n^2)。...折半插入排序是一个稳定的排序方法。

91710

插入类排序—(折半)插入排序、希尔排序

在这里插入图片描述 插入排序实现的代码为: 折半插入排序 折半插入排序和插入排序有什么关联? 首先,折半插入排序的本质依然是插入排序,仅仅是对插入排序进行了部分优化。...当然很遗憾的是,折半插入虽然可以降低查找次数,但是无法改变整个算法的时间复杂度(数组实现)。因为在每个元素的插入过程中,虽然查找可以降到log'n,但是在顺序表的向前移动交换依然还是得一个一个移动啊。...折半插入可以理解为对于每个位置的平均时间复杂度从O(N)查找+O(N)交换移动变成O(logN)查找+O(n)交换移动。...终于,有个叫希尔的牛逼人物终于研究出来一种排序算法——希尔排序。考虑到了数据量和有序性两个方面纬度来设计算法。同时,希尔排序是一组插入排序的组合。...希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 ?

46310

排序算法插入排序(直接插入排序、折半插入排序、希尔排序)

插入排序思想可以引申为三种重要的排序算法:直接插入排序、折半插入排序、希尔排序 直接插入排序 理论 直接插入是一个稳定的排序方法,适用于顺序存储和链式存储的线性表。...算法的思想是:依次将每个元素插入到前面已经排序好的子表的相应位置中。...算法实现 void InserSort(ElemType A[], int n) { int i, j; for(i=2;i<=n;i++) if (A[i] < A[i - 1]) {...A[0] = A[i]; for (j = i - 1; A[0] < A[i]; --j) A[j + 1] = A[j]; A[j + 1] = A[0]; } } 折半插入排序...折半插入排序将比较和移动操作分离,即先折半查找出元素的待插入位置,然后统一地移动待插入位置之后的所有元素。

44940

冒泡排序,选择排序,插入排序,折半插入排序

今天我们来聊聊简单算法:冒泡,简单选择,直接插入 1.冒泡排序: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录的为止,这里的反序指的是不符合当前指定排序规则的数字...由此可见: 外层循环:每一次将当前外层循环对应位置i变成仅此于前一位的最小值 内层循环:负责把外层循环对应i的值与i后面到数组结尾的元素进行大小比较,从而选出最小值替换当前I位置的值 (2)正宗冒泡算法...j = i - 1;temp>arr[j]&&j>=0; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = temp; } } } 折半插入排序...将比较找到合适位置的过程用二分查找替代,在需要对海量数据进行排序的时候,提高了效率 升序: //折半插入排序----升序 void InsertSort(int arr[], int len) {...arr[j + 1] = arr[j]; } arr[j + 1] =temp; } } 降序: #include using namespace std; //折半插入排序

27740

C语言函数二分查找(折半查找)

C语言函数二分查找(折半查找) 参考视频讲解哔哩哔哩比特鹏哥的视频 ——链接 二分查找 #include //二分查找 //在一个有序数组中查找具体的某个数 //如果找到了返回...首先找到这组被查找元素的中间的元素 //假如说发现中间元素5要比我要找的数要小 //说明我要找的数在5的右边,这样我的范围就缩小了一半 //查找了一次范围就缩小了一半,这样的速度是比较快的 //这就叫二分查找(折半查找...他们之间没有元素可以被查找的时候,结束,说明没有找到 //如果在某一次查找的时候,找到了,下标相等了,说明找到了,把下标给过来 int number_search(int arr[], int k) { //算法实现...stdio.h> int number_search(int arr[], int k) //实际上这地方传递过来的数组arr是首元素地址 //本质上这里的arr是个指针,因为指针才可以接收地址 { //算法实现

84820

经典折半查找算法

而用折半查找,开始的比较区间是1-6, 先取中间一个数,即第3个数6, 9比6大,说明在6的后面,下面就把区间变成4-6, 取中间数,即第5个数9,正好找到,这样总次数变成2次查找。...1; else if( a[mid] > key) right = mid - 1; } return -1; // 未找到key } 用递归算法完成二分查找...若果不存在,first停在第一个大于key的位置,即返回一个这样的下标: 在此处插入key,序列依然有序。...若果不存在, right停在第一个大于key的位置,即返回一个这样的下标: 在此处插入key,序列依然有序。 return ( last > 0 && a[last] == key ) ?...满足 >=x的范围中查找最小的一个 考虑“求某个条件C(x)的最小x” ,这个问题,对于任意满足C(x)的x,如果所有的x’ > x 也满足C(x’)的话,这个问题可以想像成一个特殊的单调函数,在s的一侧不合法

78530

Java 实现二分(折半)插入排序

大家好,又见面了,我是全栈君 设有一个序列a[0],a[1]…a[n];当中a[i-1]前是已经有序的,当插入时a[i]时,利用二分法搜索a[i]插入的位置 效率:O(N^2),对于初始基本有序的序列,...效率上不如直接插入排序;对于随机无序的序列,效率比直接插入排序要高 /* * 二分(折半)插入排序 * 设有一个序列a[0],a[1]...a[n];当中a[i-1]前是已经有序的,当插入时a[i]时,...3个索引上的元素要插入的位置是:2918 562 531 442 210 216 931 706 333 132 第4个索引上的元素要插入的位置是:4918 562 531 442 210 216 931...706 333 132 第5个索引上的元素要插入的位置是:4918 562 531 442 216 210 931 706 333 132 第6个索引上的元素要插入的位置是:0931 918 562...531 442 216 210 706 333 132 第7个索引上的元素要插入的位置是:2931 918 706 562 531 442 216 210 333 132 第8个索引上的元素要插入的位置是

20910

C#插入排序算法

插入排序实现原理 插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。...直到找到小于或等于temp的元素位置,将temp插入到该位置后面。 这样重复步骤2至4,直到所有元素都被插入到适当的位置则排序结束。...插入排序图解 插入排序完整代码示例         public static void InsertionSort(int[] array)         {             int arrayLength...InsertionSort(array);             Console.WriteLine("排序后:" + string.Join(", ", array));         } 输出结果 总结 插入排序算法是一种简单且直观的排序算法...插入排序在处理小型数据集时具有一定优势,但是对于大型数据集,插入排序的性能会较差。

15620

C#插入排序算法

插入排序实现原理插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。...直到找到小于或等于temp的元素位置,将temp插入到该位置后面。这样重复步骤2至4,直到所有元素都被插入到适当的位置则排序结束。...插入排序图解插入排序完整代码示例        public static void InsertionSort(int[] array)        {            int arrayLength...InsertionSort(array);            Console.WriteLine("排序后:" + string.Join(", ", array));        }输出结果总结插入排序算法是一种简单且直观的排序算法...插入排序在处理小型数据集时具有一定优势,但是对于大型数据集,插入排序的性能会较差。

10510

C语言之冒泡排序、选择排序、折半查询、进制查表

,想快速找到某一个值对应的位置,进行插入或者删除,可以用到折半查询 int arr3[10000]; //定义一个一万个元素的数组 //给数组按顺序赋值 for (int i =...//问题4:查询假如把数字18001插入数组中,应该插入到哪个位置,查询到这个位置耗时多久?...1毫秒 按顺序查询18000值位置共查询次数9001次, 耗时30毫秒 折半查询18000值的位置共查询次数12次,耗时1毫秒 按顺序查询1001值应插入位置索引:500,...共查询次数501次, 耗时2毫秒 折半查询1001值应插入位置索引:501, 共查询次数14次, 耗时0毫秒 按顺序查询18001值应插入位置索引:9000, 共查询次数9001次..., 耗时37毫秒 折半查询18001值应插入位置索引:9000, 共查询次数13次, 耗时1毫秒 */ printf("\n"); return

1.8K30

C语言实现插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。...它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 一般来说,插入排序都采用in-place在数组上实现。...具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置...; 将新元素插入到该位置后; 重复步骤2~5。... sizeof(arr) / sizeof(arr[0]); ++i) {         printf("%d  ", arr[i]);     }     return 0; } /**  * 插入排序

73730

C语言】排序之插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。...插入排序在实现上,通常采用in-place排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 一般来说,插入排序都采用in-place在数组上实现。...具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置...将新元素插入到该位置后 重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。...该算法可以认为是插入排序的一个变种,称为二分查找插入排序。

1.3K30
领券