数据结构之希尔排序
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; }
相关文章推荐
- <数据结构>二叉树的递归、非递归以及层次遍历算法C语言实现
- 数据结构:位图法(bitmap||BMP)
- [Usaco2011 Nov]Cow Steeplechase奶牛越野跑(二分图裸题)
- 顺序表.cpp [数据结构实现 之 线性表]
- 数据结构之直接插入排序
- 指针的魅力
- 严蔚敏版数据结构例1-7实例
- 渣渣小本求职复习之路每天一博客系列——数据结构与常用算法(1)
- 数据结构二------循环队列实现医院候诊诊治系统
- 常见的数据结构java实现
- <数据结构>栈的应用三:迷宫问题
- <数据结构>栈的应用二:进制间的转换
- <数据结构>栈的应用一:括号匹配检测
- 数据结构(c++) 链表
- 【数据结构】——快速排序
- <数据结构>链栈的C语言实现
- <数据结构>顺序栈的C语言实现
- Java集合与数据结构
- 程序设计就像盖房子,数据结构就像砖瓦,而算法就是设计图纸
- 程序设计就像盖房子,数据结构就像砖瓦,而算法就是设计图纸