直接插入排序
时间复杂度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 InsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外
{
for (int i = 2; i <= length; i++) {
if (arr[i - 1].key > arr[i].key) { // 若判断时改为>=,则是不稳定排序,下同
arr[0] = arr[i];
arr[i] = arr[i - 1];
int j;
for (j = i - 2; arr[j].key > arr[0].key; j--)
arr[j + 1] = arr[j];
arr[j + 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;
InsertSort(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
*/
若排序的函数写成下面这样:
void InsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外
{
for (int i = 2; i <= length; i++) {
arr[0] = arr[i]; // 当当前比较的元素比前一个大时(前面的都已排好序),可直接continue,以免复制去又复制来
int j;
for (j = i - 1; arr[j].key > arr[0].key; j--)
arr[j + 1] = arr[j];
arr[j + 1] = arr[0];
}
}
代码是简洁了些,但有些微妙的缺陷,如注释所示。
比如排
12
27
用第二种要浪费两次复制。