点击查看代码
/*希尔排序
希尔排序又称缩小增量排序
希尔排序的思想是:
先选定一个整数,把待排序数组中所有元素分成gap个组,然后将相差gap个位置(gap也称为步长)的元素分在同一个组内,再分别对gap个组各自进行直接插入排序。
后续每一轮将gap缩小为原来的一半,继续重复分组和排序工作,当gap=1时就表示所有元素都在同一个组内,然后再排序一次就能得到有序序列
gap的选择有很多种,初始值一般可以设为待排序元素个数n的一半
*/
#include <iostream>
using namespace std;
/*
函数功能:对每个组各自进行直接插入排序
函数列表:
a[]:待排序数组
n:待排序元素个数
gap:步长
group:当前分组号
*/
void GroupSort(int a[], int n, int gap, int group) {
int i; //第group组的索引
//在第group组中,将相隔gap个位置的元素取出组成一个组
for (i = group + gap; i < n; i += gap) {
if (a[i] < a[i - gap]) { //在第group组中,后一个元素小于前一个元素,则对该组进行直接插入排序
int tmp = a[i]; //暂存待插入元素a[i]
int j = i - gap; //在第group组中,前一个元素的下标j=i-gap
//直接插入排序
while (j >= 0 && a[j] > tmp) {
a[j + gap] = a[j]; //将前一元素后移
j = j - gap; //j继续向前查找
}
a[j + gap] = tmp; //排序结束,插入tmp(退出while循环时多减了gap,因此j+gap才是插入位置)
}
}
}
//希尔排序(升序排序)
void ShellSort(int a[], int n) {
int gap, group; //gap为步长,group为当前排序的第x组
//希尔规则:起始步长为n/2,后续每次缩小为原来的一半
//步长为X表示有X个组,即有gap个组,对每一组都执行步长为gap的直接插入排序
for (gap = n / 2; gap > 0; gap /= 2) {
for (group = 0; group < gap; group++) {
GroupSort(a, n, gap, group);
}
}
}
int main() {
int a[] = { 80,30,60,40,20,10,50,70 };
int n = (sizeof(a)) / (sizeof(a[0]));
cout << "序列个数:" << n << endl;
cout << "排序前:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
ShellSort(a, n); //希尔排序
cout << "排序后:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}