●希尔排序法
1.简要介绍
希尔排序算法是基于插入排序法的思想,其又被称为希尔排序或者缩小增量排序。它的具体流程如下:(结合希尔排序算法代码段理解)
for (int r = n / 2; r >= 1; r /= 2) //化组排序 { for (int i = r; i < n; i++) { int temp = arr[i]; int j = i - r; while (j >= 0 && temp < arr[j]) { arr[j + r] = arr[j]; j -= r; } arr[j + r] = temp; } }
①将有n个元素的数组分成n/2个数字序列(化组操作)。进行第一次循环:第1个数据和第n/2+1个数字序列为一个比较对,判断是否执行while循环,若执行则进行循环操作(插入排序思想);反之,则将n/2+1数字放回原位。进行第二次循环:第2个数据和第n/2+2个数字序列为一个比较对,判断是否执行while循环,若执行则进行循环操作(插入排序思想);反之,则将n/2+2数字放回原位。操作如上......(插入排序法:http://t.csdn.cn/ukSxu)
②一整次循环使每一个序列对排好顺序
③然后,再将这有n个元素的数组分成n/4个序列(化组操作),再次进行排序
④不断重复上述流程,随着序列减少,直到变为一个序列对,也就完成了整个排序过程
2.图形化演示
(在下面的图中,虚线表示不符合while循环判断,实线表示符合并执行while循环判断,实线下面的数字符号为执行了几次的while循环。红色箭头的temp在每次的while判断语句中为每一个数字序列比较对中的值,它在每次循环中是进行后移的。结合代码和输出结果对下面的过程进行理解)
初始状态:
第一次化组:
第二次化组:
第三次化组:
结束状态:
3.代码如下
#include<iostream> using namespace std; #define size 10 class shellsort { public: void shellsort_1(); void showresult(); int arr[size]; }; void shellsort::shellsort_1() { int x=0; for (int r = size / 2; r >= 1; r /= 2) //化组排序 { for (int i = r; i < size; i++) { int temp = arr[i]; int j = i - r; while (j >= 0 && temp < arr[j]) { arr[j + r] = arr[j]; j -= r; } arr[j + r] = temp; } //测试代码 x++; cout << "第" << x << "步排序的结果:"; for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; } } void shellsort::showresult() { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; } void text() { shellsort ss; cout << "请输入要排序的10个数:" << endl; for (int i = 0; i < size; i++) { cin >> ss.arr[i]; } ss.shellsort_1(); cout << "排序后的10个数为:" << endl; ss.showresult(); } int main() { text(); }
4.结果如下