插入排序 给出一下四种方法:
直接插入排序,折半插入排序,二路插入排序,希尔插入排序
代码实现:
#include<iostream>
using namespace std;
#define size 21
typedef int Sqlist[size];
void SInsertSort(Sqlist &L, int n) //直接插入
{
cout << "直接插入排序" << endl;
for (int i = 2; i < n; ++i)
{
if (L[i] < L[i - 1]) //判断i与i-1位置的大小
{
L[0] = L[i]; //将i位置赋值给哨兵位
int j;
for (j = i - 1; L[0] < L[j]; --j)
{
L[j + 1] = L[j]; //循环后移
}
L[j + 1] = L[0];
}
}
}
void BInsertSort(Sqlist &L, int n)
{
cout << "折半插入排序" << endl;
for (int i = 2; i < n; ++i)
{
L[0] = L[i];
int low = 1;
int high = i - 1;
int mid = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (L[0] < L[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (int j = i - 1; j >= high + 1; --j)
{
L[j + 1] = L[j]; //循环后移
}
L[high + 1] = L[0];
}
}
void TWInsertSort(Sqlist &L, int n) //2—路插入排序
{
cout << "二路插入排序" << endl;
Sqlist T;
T[0] = L[0];
int first;
int last;
first = last = 0;
for (int i = 1; i < n; ++i)
{
if (L[i] < T[first])
{
first = (first - 1 + n) % n;
T[first] = L[i];
}
else if (L[i] > T[last])
{
last++;
T[last] = L[i];
}
else
{
last++;
T[last] = T[last - 1];
int j = last - 1;
for (; L[i] < T[(j - 1 + n) % n]; j = (j - 1 + n) % n)
{
T[j] = T[(j - 1 + n) % n];
}
T[j] = L[i];
}
}
for (int i = 0; i < n; ++i)
{
L[i] = T[first];
first = (first + 1) % n;
}
}
void ShellInsert(Sqlist &L, int n, int dk)//希尔插入
{
int t;
for (int i = dk + 1; i <= n; ++i) //按增量变化
{
if (L[i] < L[i - dk]) //比较大小
{
t = L[i];
int j = i - dk;
for (; j>0 && t<L[j]; j -= dk)
{
L[j + dk] = L[j];
}
L[j + dk] = t; //赋值
}
}
}
void ShellSort(Sqlist &L, int n, int dlta[], int t)//希尔排序
{
for (int k = 0; k < t; ++k) //按照增量数组值重复插入排序
{
ShellInsert(L, n, dlta[k]);
}
}
void main()
{
Sqlist sq = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//0为哨兵位
cout << "原数组为:" << endl;
for (int i = 1; i < 9; ++i)
{
cout << sq[i]<<' ';
}
cout << endl;
SInsertSort(sq,9);
for (int i = 1; i < 9; ++i)
{
cout << sq[i] << ' ';
}
cout << endl;
BInsertSort(sq, 9);
for (int i = 1; i < 9; ++i)
{
cout << sq[i] << ' ';
}
cout << endl;
Sqlist Sq = { 49, 38, 65, 97, 76, 13, 27, 49 };
cout << "原数组为:" << endl;
for (int i = 0; i < 8; ++i)
{
cout << Sq[i]<<' ';
}
cout << endl;
TWInsertSort(Sq, 8);
for (int i = 0; i < 8; ++i)
{
cout << Sq[i] << ' ';
}
cout << endl;
Sqlist sQ = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//哨兵位
cout << "原数组为:"<<endl;
for (int i = 1; i <= 8; ++i) //打印sQ
{
cout << sQ[i] << " ";
}
cout << endl;
int dlta[] = { 5, 3, 1 }; //增量数组
ShellSort(sQ, 8, dlta, sizeof(dlta) / sizeof(int));//希尔排序
cout << "希尔排序:" << endl;
for (int j = 1; j <= 8; ++j)
{
cout << sQ[j] << " ";
}
cout << endl;
}
输出结果: