八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序,

1、基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数
x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了。

2、代码:

  

3、复杂度:

用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较次数。

八大排序算法学习笔记:插入排序(二分插入排序)

时间: 2024-12-24 13:57:31

八大排序算法学习笔记:插入排序(二分插入排序)的相关文章

八大排序算法学习笔记:插入排序(一)

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 1.算法的伪代码(这样便于理解):     INSERTION-SORT (A, n)             A[1 . . n] for j ←2 to n do key ← A[ j] i ← j – 1 while i > 0 and A[i] > key do A[i+1] ← A[i]

八大排序算法学习笔记:冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 算法原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有

经典排序算法学习笔记四——希尔排序

一.希尔排序 数据结构 数组 最差时间复杂度 根据步长序列的不同而不同.已知最好的:O(n*log ^{2}n) 最优时间复杂度 O(n) 平均时间复杂度 根据步长序列的不同而不同. 最差空间复杂度 O(n) 1.算法思想: 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: 然后取d2<d1,重复上述分组和排序操作: 直至di=1,即所有记录放进一个组中排序为止. 我是栗子,栗子,栗子 假设有这样一组数[ 13 14 94 33 82 25 59 94 65

经典排序算法学习笔记之二——快速排序

一.快速排序 数据结构 不定 最差时间复杂度 O(n^2) 最优时间复杂度 O (n*log n) 平均时间复杂度 O (n*log n) 最差空间复杂度 根据实现的方式不同而不同 https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F 1.算法思想: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边

经典排序算法学习笔记3——插入排序

一.插入排序 工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 数据结构 数组 最差时间复杂度 O(n^2) 最优时间复杂度 O(n) 平均时间复杂度  O(n^2) 最差空间复杂度 总共 O(n) ,需要辅助空间O(1) https://zh.wikipedia.org/wiki/

经典排序算法学习笔记之一——冒泡排序

一.冒泡排序 1.算法思想: 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 2.伪代码: function bubble_sort (array, length) { var i, j; for(i from 0 to length-1){ for

经典排序算法学习笔记五——直接选择排序

一.直接选择排序 数据结构 数组 最差时间复杂度 O(n^2) 最优时间复杂度 O(n^2) 平均时间复杂度 O(n^2) 最差空间复杂度 О(n) total, O(1) auxiliary 1.算法思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾. 以此类推,直到所有元素均排序完毕. 2.伪代码: repeat (numOfElements - 1) times set the first uns

经典排序算法学习笔记七——堆排序

堆排序 数据结构 数组 最差时间复杂度 O(n*log n) 最优时间复杂度 O(n*log n) 平均时间复杂度 O(n*log n) 最差空间复杂度 О(n) total, O(1) auxiliary 1.堆的基础知识 堆节点的访问 通常堆是通过一维数组来实现的.在数组起始位置为0的情形中: 父节点i的左子节点在位置(2*i+1); 父节点i的右子节点在位置(2*i+2); 子节点i的父节点在位置floor((i-1)/2); 堆的操作 在堆的数据结构中,堆中的最大值总是位于根节点.堆中定

【算法学习笔记】-二分查找算法

二分搜索是一种常用的搜索方法,它要求数组中的元素必须是有序存放的.不失一般性,我们假定数组元素按升序存放.二分搜索方法首先将关键字与位于数组中央的元素进行比较,比较结果有三种情况: 1)如果关键字小于中央元素,我们只需要继续在数组的前半部分进行搜索. 2)如果关键字与中央元素相等,则搜索结束,找到匹配元素. 3)如果关键字大于中央元素,我们只需要继续在数组的后半部分进行搜索. 二分搜索的代码如下: #include <iostream> using namespace std; int bin