参考:算法第四版
代码:
#include<iostream>
#include<ctime>
using namespace std;
void Individual(int A[], int size)
{
srand((unsigned)time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 100;
}
void Output(int A[], int size)
{
cout << endl;
for (int i = 0, j = 0; i < size; i++)
{
cout << A[i] << " ";
j++;
if (j == 10)
{
cout << endl;
j = 0;
}
}
cout << endl;
}
void swap(int A[], int i, int j)
{
int t = A[i];
A[i] = A[j];
A[j] = t;
}
//希尔排序
/*
1、使数组间隔h有序 ,插入排序实现
2、缩小h执行步骤1,直至h为1,
*/
void ShellSort(int A[], int size)
{
int h = 1;
//h可以取的值:1 , 4 , 4*3+1=13 , 40 , ......
while (h < size / 3)
{
h = 3 * h + 1;
}
while (h >= 1)
{
//将数组变为h有序 , 两个for循环组成插入排序 相隔h的元素后者大于前者则相互交换,从后往前迭代
for (int i = h; i < size; i++)
{
for (int j = i; j >= h && A[j] < A[j - h]; j -= h)
swap(A, j, j - h);
}
h = h / 3;
}
}
int main()
{
int n;
cout << "请输入要排序的数组大小:" << endl;
cin >> n;
int* array = new int[n];
Individual(array, n);
Output(array, n);
ShellSort(array, n);
Output(array, n);
delete[] array;
return 0;
}
小结:
希尔排序是最早突破o(n^2)阶的排序算法,他仅仅是把插入排序改了改就完成了算法的改进。