程序猿找工作必练内功:排序算法大总结(六)——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
原创粉丝点击