程序猿找工作必练内功:排序算法大总结(六)——shell排序
来源:互联网 发布:c语言形参和实参 编辑:程序博客网 时间:2024/06/05 22:48
shell排序由插入排序得来。插入排序的每个元素之间的间隔是1,而shell排序的每个元素的间隔是k(k>=1)。shell排序将待排序的序列以间隔k分成多个分组,对每个分组分别应用插入排序进行排序,最后再以k=1排序整个序列(相当于插入排序)。我们知道,如果一个序列是基本有序的,则应用插入排序能获得好的性能,shell排序就是利用了这个原理。shell排序先使用一组互素的k将序列排序成基本有序,最后再使用插入排序(使k=1)进行准确排序。
shell排序的时间复杂度现在还没有一个定值,但是绝对不会超过O(n^2),因此性能优于插入排序。
下边是一种实现:
//希尔排序#ifndef SHELLSORT_HPP_INCLUDED#define SHELLSORT_HPP_INCLUDED /** \brief 以增量k对序列A进行插入排序 * * \param A:序列元素指针 * \param n:序列的长度 * \param K:增量 * \return void * */ template<class Type> void shellInsert(Type *A, int n, int k) { Type temp; int j; for(int i=k; i<n; i++)//从间隔为k的第一组元素的第二个元素开始{temp = A[i];for(j=i-k; j>=0&&A[j]>temp; j-=k) //如果k=1即为插入排序A[j+k] = A[j];A[j+k] = temp;} }///** \brief 希尔排序 原理:以不同增量k调用shellInsert,且最后一个k等于1,且各个k之间没有公因子 * \param data:序列元素指针 * \param n:序列的长度 * \param k:增量序列指针 * \param m:增量序列的长度 * \return void * */template<class Type>void shellSort(Type *data, int n, int*k, int m){for(int i=0; i<m; i++)shellInsert(data, n, k[i]);}#endif // SHELLSORT_HPP_INCLUDED
0 0
- 程序猿找工作必练内功:排序算法大总结(六)——shell排序
- 程序猿找工作必练内功:排序算法大总结(一)——简单排序算法
- 程序猿找工作必练内功:排序算法大总结(二)——归并排序算法
- 程序猿找工作必练内功:排序算法大总结(三)——堆排序算法
- 程序猿找工作必练内功:排序算法大总结(四)——快速排序算法
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 排序算法总结——Shell排序
- 排序算法总结(六)归并排序
- 必会排序算法总结
- 找工作-基本查找排序算法总结
- 排序算法大总结
- 排序算法大总结
- 排序算法大总结
- 排序算法大总结
- 排序算法六——归并排序
- 复习数据结构:排序算法(六)——堆排序
- 排序算法(六)——希尔排序
- 排序算法(六)——堆排序
- 每周一篇(2):习惯的重要性
- jetty原理及与tomcat比较
- ACM搜索题目总结
- 20140102
- 怎样调试delphi写的服务程序-com对象及hook程序
- 程序猿找工作必练内功:排序算法大总结(六)——shell排序
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- Kettle数据抽取(转换)出现乱码问题解决方法
- UVa 10905 - Children's Game(求多个正整数排列后,所得的新的数字的极值)
- Uni2D —— 入门(全)
- DIY Linux with Buildroot
- contentSize、contentInset和contentOffset区别
- Tomcat 系统架构与设计模式
- I,P,B帧和PTS,DTS的关系