Sorting Algorithm-Shell Sort
来源:互联网 发布:warframe离线数据模块 编辑:程序博客网 时间:2024/05/22 15:45
Shell Sort-希尔排序
Algorithm:
希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
将相距某个"增量"的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。
Ex:
49,38,65,97,76,13,27,49,55,04
第一次:步长为5
第一组:49,13
第二组:38,27
第三组:65,49
第四组:97,55
第五组:76,04
对每组直接插入排序后 13,27,49,55,04,49,38,65,97,76
第二次:步长为2
第一组:13,27,49,55,04
第二组:49,38,65,97,76
对每组直接插入排序后 04,13,27,49,55,38,49,65,76,97
第三次:步长为1(最后步长必须是1)
最终结果: 04,13,27,38,49,49,55,65,76,97
Code:
void Shell_Sort(vector<int> &v) //步长为n/2...依次 {int gap =(v.size()/2); //初始步长while (gap > 0) //最后必为1{for (int i = gap; i < v.size(); i++){int j = i-gap;int key = v[i];while (j>=0 && v[j]>key){v[j+gap] = v[j];j = j - gap;}v[j+gap] = key;}gap /= 2;} }
Analysis:
希尔排序的关键并不是随便分组后各自排序,而是将相隔某个"增量"的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。
这里的"增量"的选取就非常关键了,目前还是一个数学难题,迄今为止还没有人找到一种最好的增量序列。不过大量的研究表明,当增量序列为dlta[k]=2^(t-k+1)-1(0<=k<=[log2(n+1)])时,可以获得不错的效果,其时间复杂度为O(n^1.5),要好于直接排序O(n^2)。需要注意的是,增量序列的最后一个增量必须等于1。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。
希尔算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为O(n^2)),之后,相应的更为高效的排序算法也就相继出现了。
unstable sort
0 0
- Sorting Algorithm-Shell Sort
- Sorting Algorithm-Bubble Sort
- Sorting Algorithm-Heap Sort
- Sorting Algorithm-Merging Sort
- Sorting Algorithm-Quick Sort
- Sorting Algorithm-Straight Insertion Sort
- Sorting Algorithm-Simple Selection Sort
- sorting - shell sort
- CSharp Algorithm - Shell sort
- Sorting Algorithm
- Sorting Algorithm
- Sorting Algorithm
- sort algorithm
- sort algorithm
- Sort algorithm
- Collection of algorithm for sorting. 常见排序算法集(三) —— Quick Sort
- BST sorting algorithm
- sorting algorithm排序算法
- 深入浅出谈java修饰符
- Android Studio怎么删除module
- Windows Shell编程之右键菜单遇到的问题
- 【Linux开发】V4L2应用程序框架
- 总结四---新的开始
- Sorting Algorithm-Shell Sort
- 几种求素数与验证素数的方法
- 偷金子
- [C/C++笔面试]判断字符串是不是回文
- 对结构体初始化
- Android按钮事件响应顺序
- MySQL集群搭建详解
- ubunut recovery mode 下拷贝数据到u盘
- 使用TCP协议的NAT穿透技术