//插入排序头文件 Sort.h
#pragma once
#define T int
#define MAXSIZE 20
typedef T Sqlist[MAXSIZE];
void Swap(T *a, T *b)
{
T tmp = *a;
*a = *b;
*b = tmp;
}
//直接插入排序
void InsertSort(Sqlist &list, int n)
{
for (int i = 1; i < n; ++i)
{
if (list[i] < list[i - 1])
{
Swap(&list[i], &list[i - 1]);
for (int j = i - 1; j>0 && list[j] < list[j - 1]; --j)
{
Swap(&list[j], &list[j - 1]);
}
}
}
}
//折半插入排序 减少比较次数
void HalfInsert(Sqlist &list, int n)
{
for (int i = 2; i < n; ++i)
{
list[0] = list[i];
int low = 1;
int high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (list[0] >= list[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
for (int j = i; j >high + 1; --j)
{
list[j] = list[j - 1];
}
list[high + 1] = list[0];
}
}
//2路插入排序 减少数据移动次数
void TwoInsertSort(Sqlist &list,int n)
{
Sqlist tmp;
int head, tail;
head = tail = 0;
tmp[head] = list[0];
for (int i = 1; i < n; ++i)
{
if (list[i] < tmp[head])
{
head = (head - i + n) % n;
tmp[head] = list[i];
}
else if (list[i] > tmp[tail])
{
tail++;
tmp[tail] = list[i];
}
else
{
int j;
tail++;
tmp[tail] = tmp[tail - 1];
for (j = tail - 1; list[i] < tmp[(j - 1+n)%n]; j=(j-1+n)%n)
{
tmp[j] = tmp[(j - 1+n)%n];
}
tmp[j] = list[i];
}
}
for (int i = 0; i < n; ++i)
{
list[i] = tmp[head];
head = (head +1) % n;
}
}
//表插入排序
#define MAXVALUE 0x7fffffff
typedef struct SLNode
{
T data;
int link;
}SLNode;
typedef SLNode Table[MAXSIZE];
void TableInsertSort(Table &t, int n)
{
t[0].link = 1;
int p, q;
for (int i = 2; i < n; ++i)
{
p = t[0].link;
q = 0;
while ((p != 0) && (t[p].data<=t[i].data))
{
q = p;
p = t[p].link;
}
t[i].link = t[q].link;
t[q].link = i;
}
}
//希尔排序
void ShellInsert(Sqlist &list, int n, int dk)
{
int i, j;
for (i = dk + 1; i < n; ++i)
{
if (list[i] < list[i - dk])
{
list[0] = list[i];
for (j = i - dk; j>0 && list[0] < list[j]; j-=dk)
{
list[j + dk] = list[j];
}
list[j + dk] = list[0];
}
}
}
void ShellSort(Sqlist &list, int n, int dlta[], int t)
{
for (int k = 0; k < t; ++k)
{
ShellInsert(list, n, dlta[k]);
}
}
//测试函数
#include<iostream>
#include"Sort.h"
using namespace std;
#define USE_ZERO_SPACE
#if 1
void main()
{
#ifdef USE_ZERO_SPACE
Sqlist L = {0, 49,38, 97, 76,13,49};
int n = 7;
#else
Sqlist L = {49,38, 65, 97, 76,13,27,49};
int n = 8;
#endif
//InsertSort(L, n);
//HalfInsert(L, n);
//TwoInsertSort(L, n);
//int dlta[] = {3,2,1};
//int t = sizeof(dlta) / sizeof(int);
//ShellSort(L, n, dlta, t);
#ifdef USE_ZERO_SPACE
for (int i = 1; i != n; ++i)
{
cout << L[i] << " ";
}
cout << endl;
#else
for (int i = 0; i != n; ++i)
{
cout << L[i] << " ";
}
cout << endl;
#endif
}
#endif
//测试表排序
#if 0
void main()
{
Sqlist L = { 0, -1, 45, 30, 32, 68 };
int n = 6;
Table tb;
tb[0].data = MAXVALUE;
tb[0].link = 0;
for (int i = 1; i < n; ++i)
{
tb[i].data = L[i];
tb[i].link = 0;
}
TableInsertSort(tb, n);
for (int i = 0; i <n; ++i)
{
cout << tb[i].data << " ";
}
cout << endl;
for (int i = 0; i < n; ++i)
{
cout << tb[i].link << " ";
}
cout << endl;
}
#endif