折半插入排序
時間複雜度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;// 插入點在低半區elselow = 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 138 065 097 076 013 027 049 2out:13 027 038 049 149 265 076 097 0*/