您的位置:首页 > 其它

【插入排序】直接,折半,二路,希尔

2015-06-17 13:13 204 查看
插入排序 给出一下四种方法:

直接插入排序,折半插入排序,二路插入排序,希尔插入排序

代码实现:

#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;
}


输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: