数据结构之希尔排序

来源:互联网 发布:直销平台软件 编辑:程序博客网 时间:2024/05/01 21:28

        直接插入排序在数据量较小而且接近"正序"的时候,时间复杂度可以小至O(n),所以如果我们能够让数据量变小且变得接近"正序",然后用直接插入排序就好了。希尔排序就是做这么个事情,它首先将数据拆成几部分,即达到缩小数据规模排序,再将数据合并起来,达到整体的"正序",然而将数据的正序并非局部的"正序",即不是(6,7,8, 3,4,5, 0,1,2),而是整体的正序,所以在将数据分割成几组的时候不能一堆堆的分割,而应该跳跃式分割,用一个系数d来控制。

#include <iostream>using namespace std;
// 希尔插入,和直接插入唯一不同的是,每个元素位置相隔不是1,而是d,其他一模一样// 即只要d传入1,就是直接插入排序void shellInsert(int src[], int d,int n){// 哨岗元素int save;int j;for (int i = d; i <= n; ++i){save = src[i];// 逐个与前面(-d)的元素进行比较for (j = i; j-d>=0 && save<src[j-d]; j-=d){src[j] = src[j-d];}src[j] = save;}}
void shellSort(int src[], int n){// 每次将数据分割成几组,然后进行直接插入排序// d的选择是很重要的,质数,奇数,避免相互倍数,最后一个一定要为1// 这里的d是随便写的,没有经过仔细考虑的,查了几本数据结构的树,有一本是d=d/3+1(d初始化时为n)for (int d = (n+1)/2; d>=1; d = d/2){shellInsert(src, d, n);}}
int main(){int src[10] = {4,5,6,7,8,9,1,2,3,0};int number = 9;shellSort(src, number);for (int i = 0; i <= number; ++i)cout<<src[i]<<" ";cout<<endl;return 0;}