算法复习-插入类排序(2)-折半插入排序

折半插入排序

折半插入排序是根据折半查找法来查找插入位置的。
折半查找的一个基本条件是序列已经有序。而从直接插入排序中可以看出,每一次插入后,序列都是有序的,所以可以用折半插入排序来提高性能。

代码:

#include <iostream>
using namespace std;

void InsertSort(int array[], int n) {
  int i, j, temp, low, high, mid;
  for (i = 1; i < n; ++i) {
    temp = array[i];
    low = 0;
    high = i - 1;
    j = i - 1;

    while (low <= high) {
      mid = (low + high) / 2;
      if (temp < array[mid])
        high = mid - 1;
      else
        low = mid + 1;
    }

    for (j = i - 1; j >= low; --j)
      array[j+1] = array[j];

    array[low] = temp;
  }
}

void print_array(int array[], int n) {
  for (int i = 0; i < n; ++i)
    cout<<array[i]<<" ";
  cout<<endl;
}

int main() {
  int array[] = {38, 49, 27, 65, 76, 97, 13, };
  print_array(array, 7);
  InsertSort(array, 7);
  print_array(array, 7);

  return 0;
}

复杂度分析:

1. 时间复杂度
与直接插入排序相比,折半插入排序在查找插入位置上所花的时间大大减少。但是从代码中可以看出,找到插入位置后,还需要将后面的进行移动,折半插入排序在关键字移动次数方面和直接插入排序是一样的,所以其时间复杂度和直接插入排序还是一样的,是O(n^2)。
但是折半插入的比较次数是一定的。

2. 空间复杂度
和直接插入排序一样,为O(1)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容