折半插入排序

时间复杂度O(n^2)

附加空间O(1)

稳定排序

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #define LEN 8 // 有LEN个元素要排 struct Record { // 为了考察排序的稳定性,定义元素是结构体类型 int key; int otherinfo; }; void BInsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外 { for (int i = 2; i <= length; ++i) { arr[0] = arr[i]; // 将arr[i]暂存到arr[0] int low = 1; int high = i - 1; while (low <= high) { // 在arr[low..high]中折半查找有序插入的位置 int m = (low + high) / 2; // 折半 if (arr[0].key < arr[m].key) // 关键字相同时,使low = m + 1,到高半区,保证稳定性 high = m - 1; // 插入点在低半区 else low = m + 1; // 插入点在高半区 } for (int j = i - 1; j >= high + 1; --j) arr[j + 1] = arr[j]; // 记录后移 arr[high + 1] = arr[0]; // 插入 } } int main(void) { freopen("in.txt", "r", stdin); Record a[LEN + 1] = {0}; for (int i = 1; i <= LEN; i++) cin >> a[i].key >> a[i].otherinfo; BInsertSort(a, LEN); for (int i = 1; i <= LEN; i++) cout << a[i].key << '\t' << a[i].otherinfo << endl; return 0; } /* in.txt: 49 1 38 0 65 0 97 0 76 0 13 0 27 0 49 2 out: 13 0 27 0 38 0 49 1 49 2 65 0 76 0 97 0 */