表插入
时间复杂度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 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
*/