表插入
時間複雜度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;int next;};void LinkListInsertSort(Record *arr, int length)//length是要排序的元素的個數,0號單元除外{for (int i = 2; i <= length; ++i) {int q = 0;//q跟在p之後,以方便插入結點(插在q後p前)for (int p = arr[0].next; p != 0; p = arr[p].next) {//作為單鏈表,只能從前向後找(用雙向鏈表可避免)if (arr[p].key > arr[i].key)//這是從前向後找的缺陷:到相同的,還得繼續向後(而直接插入排序是從後向前找的)break;q = p;}arr[i].next = arr[q].next;//p為0時亦然arr[q].next = i;}}int main(void){freopen("in.txt", "r", stdin);Record a[LEN + 1] = {0};a[0].next = 1;//0號單元作為頭結點,指標域注意初始化for (int i = 1; i <= LEN; ++i)cin >> a[i].key >> a[i].otherinfo;LinkListInsertSort(a, LEN);for (int p = a[0].next; p != 0 ; p = a[p].next)cout << a[p].key << '\t' << a[p].otherinfo << endl;return 0;}/*in.txt:49 138 065 097 076 013 027 049 2out:13 027 038 049 149 265 076 097 0*/