您的位置:首页 > 理论基础 > 数据结构算法

数据结构之希尔排序

2013-11-02 17:15 267 查看
        直接插入排序在数据量较小而且接近"正序"的时候,时间复杂度可以小至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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: