希尔排序
来源:互联网 发布:新版淘宝没有摇一摇 编辑:程序博客网 时间:2024/06/11 19:09
参考自:
http://blog.csdn.net/morewindows/article/details/6668714
1、算法思路
由于插入排序对于大体上已排好序的数组具有很高的效率,希尔排序的思路就是以不同的gap将整个数组分组,分别对这几组进行插入排序。实现大体上排好序,最后来一次直接插入排序。
以下面数组为例,
6 1 2 8 10 4 3 9 5 7
(1)先令gap=10(数组长)/2=5,步长相隔5的数分为一组
先以下面加粗部分为一组,进行插入排序
6 1 2 8 10 4 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7
然后接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7
接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7
再接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 5 10 6 3 9 8 7
最后对此轮的最后一组(加粗部分),进行插入排序
4 1 2 5 10 6 3 9 8 7
得到
4 1 2 5 7 6 3 9 8 10
(2)再令gap=gap/2=2,步长相隔2的数分为一组
则对下面加粗部分进行插入排序
4 1 2 5 7 6 3 9 8 10
得到
2 1 3 5 4 6 7 9 8 10
接着是下一组(加粗部分)进行插入排序
2 1 3 5 4 6 7 9 8 10
得到
2 1 3 5 4 6 7 9 8 10
gap=2的就完成了
(3)再令gap=gap/2=1,步长相隔1的数分为一组,即整个数组
则对整个数组进行插入排序
2 1 3 5 4 6 7 9 8 10
得到
1 2 3 4 5 6 7 8 9 10
(4)以上就完成了
2、核心代码
int shellSort(int *data, unsigned int length){ if (data == NULL) { return -1; } //分不同的gap for (int gap = length/2; gap > 0;gap=gap/2) { //在同一gap中分组 for (int i = 0; i < gap; i++) { //遍历在同一组中的数据 for (int j = i+gap; j < length; j=j+gap) { int temp = data[j]; int k = j - gap; while (k>=0&&data[k]>temp) { data[k + gap] = data[k]; k = k - gap; } data[k + gap] = temp; } } } return 0;}
3、Test代码
#include<iostream>#include<string>using namespace std;int shellSort(int *data, unsigned int length);void main(void){ int array[10] = {6,1,2,8,10,4,3,9,5,7}; int num = 10; //step1: 遍历数组,输出初始排列 for (int arN = 0; arN < num; arN++) { cout << array[arN]<<' '; } cout << endl; //step2: 希尔排序 shellSort(array, num); //step3: 遍历数组,输出排序后结果 for (int arN = 0; arN < num; arN++) { cout << array[arN]<<' '; }}int shellSort(int *data, unsigned int length){ if (data == NULL) { return -1; } //分不同的gap for (int gap = length/2; gap > 0;gap=gap/2) { //在同一gap中分组 for (int i = 0; i < gap; i++) { //遍历在同一组中的数据 for (int j = i+gap; j < length; j=j+gap) { int temp = data[j]; int k = j - gap; while (k>=0&&data[k]>temp) { data[k + gap] = data[k]; k = k - gap; } data[k + gap] = temp; } } } return 0;}