希尔排序是一种插入法排序的一种改进版本,同时要知道希尔排序是一种非稳定的排序算法,非稳定排序是值当有两个相同值在进行排序的时候,可能会引起位置调换。
希尔排序的思想是:
先取一个小于n的整数d作为增量,将所有元素进行分组,所有距离为d的倍数的记录放在同一个族中,先在各组中进行直接插入排序,然后再取第二个整数d2作为增量进行分组和排序,一直到增量为1的时候,再进行最后一次排序,这样就对整个数组进行了完整的排序。
具体代码如下所示:
#include <iostream>
using namespace std;
void print(int *a, int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void xier_order(int *a, int n)
{
int i, j, gap;
int tmp;
for (gap = n / 2; gap > 0; gap /= 2)
{
for (i = gap; i < n; i++)
{
tmp = a[i];//将准备插入的元素取出来
for (j = i; j >= gap; j -= gap)//将取出的元素和组内元素进行对比
{
if (tmp < a[j - gap])
{
a[j] = a[j - gap];//将取出的tmp值与组内元素值比较完之后互相调换位置也就是将取出元素插入比他小的元素的位置
}
else
{
break;//跳出包含break的第一个for循环
}
}
a[j] = tmp;
}
}
print(a, n);
}
void main()
{
int a[] = { 3,5,2,4,9,7,6,1,0 };
int n = sizeof(a) / sizeof(*a);
xier_order(a, n);
cout << "result" << endl;
print(a, n);
cout << "hello world";
system("pause");
return;
}
运行结果如下所示: