数据结构——折半插入排序

简介: 数据结构——折半插入排序

一、算法介绍


1.算法思想


折半插入排序的思想是借用了折半查找的思路,通过在已经有序的序列(默认序列第一个元素为有序序列)中利用二分查找快速定位插入位置,这样经过n-1趟插入就能完成排序,当元素较多时,折半插入排序效率更优于直接插入排序。


2.算法流程


默认序列第一个元素是已经有序序列,每次从无序序列中拿取一个元素,通过折半查找快速找到在有序序列中的插入位置,然后插入元素,经过n-1趟插入完成排序。默认排升序。


示例:


待排序序列:4,2,8,9,5,6,1,3,7


image.png


二、算法实现


1.代码实现


#include<iostream>
using namespace std;
void BinarySearch(int* arr, int size) {//折半插入排序
  for (int i = 1; i < size; i++) {//默认第一个元素为有序序列,所以从1开始循环
  if (arr[i] < arr[i - 1]) {//如果当前元素大于等于有序序列所有元素,不需要进行查找插入
    int  key = arr[i];//标记待插入元素
    int left = 0;
    int right = i - 1;
    while (left <= right) {
    int mid = (left + right) / 2;
    if (arr[mid] > key) {
      right = mid - 1;
    }
    else {
      left = mid + 1;
    }
    }
    for (int j = i - 1; j > right; j--) {//顺序后移
    arr[j + 1] = arr[j];
    }
    arr[right + 1] = key;//插入元素
  }
  }
}
void PrintArr(int* arr, int size) {//数组打印
  cout << endl;
  for (int i = 0; i < size; i++) {
  cout << arr[i] << ' ';
  }
}
void Test() {
  int arr[] = { 4,2,8,9,5,6,1,3,7 };
  //int arr[] = { 15,1,1,45,12,125,15,45,20,-3 };
  int size = sizeof(arr) / sizeof(arr[0]);
  cout << "排序前:";
  PrintArr(arr, size);
  BinarySearch(arr, size);
  cout << endl << "排序后:";
  PrintArr(arr, size);
}
int main() {
  Test();
  return 0;
}


2.测试用例及结果


测试用例1:4,2,8,9,5,6,1,3,7


测试结果:


1.png


测试用例2:15,1,1,45,12,125,15,45,20,-3


测试结果:


2.png


三、性能分析


1.时间复杂度


最坏情况124.gif


根据算法思想可知,最坏情况即元素刚好与排序要求相反的情况,每次都需要进行位置折半查找,虽然利用折半查找提高了查找性能,但是移动元素的次数是固定的,所以最坏情况下的时间复杂度为124.gif


最好情况1234.gif


最好情况自然就是元素本身已经有序的情况下,那么每个元素只需要在开始时的一次比较就确认已经处于对应位置,不再需要进行折半查找插入,因此最好情况下的时间复杂度为1234.gif


平均情况  124.gif


综合两种情况,折半插入排序的时间复杂度为 124.gif


2.空间复杂度


由于算法实现中只使用了几个临时变量作为标记,没有借助额外的辅助空间,所以空间复杂度为O(1)。


相关文章
|
3月前
|
搜索推荐 测试技术
【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】
【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】
|
4月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
4月前
|
算法 搜索推荐
数据结构与算法-插入排序
数据结构与算法-插入排序
28 2
|
5月前
|
存储 搜索推荐 算法
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
|
4月前
|
人工智能 算法 C语言
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
31 0
|
5月前
|
C语言
【C语言/数据结构】排序(直接插入排序|希尔排序)
【C语言/数据结构】排序(直接插入排序|希尔排序)
31 4
|
4月前
|
存储 搜索推荐
深入了解数据结构第四弹——排序(1)——插入排序和希尔排序
深入了解数据结构第四弹——排序(1)——插入排序和希尔排序
27 0
|
5月前
|
搜索推荐 算法 C++
[数据结构]-玩转八大排序(一)&&插入排序&&选择排序
[数据结构]-玩转八大排序(一)&&插入排序&&选择排序
|
5月前
|
搜索推荐 测试技术
[数据结构]——排序——插入排序
[数据结构]——排序——插入排序
|
5月前
|
算法 搜索推荐 测试技术
数据结构——lesson10排序之插入排序
数据结构——lesson10排序之插入排序