shell排序算法:
shell排序算法的时间复杂度为o(n2),本文中的间隔每次除以2,若修改时间间隔,那么就可以得到更加优化的时间代价
shell排序算法基于插入排序的两个性质:
1、小序列性质:插入排序在小序列时的排序时间较短.
2、有序性质:插入序列在有序序列中的时间消耗较少,接近于O(n).
因此可以将较长的序列分割成一些较小的序列进行插入排序,然后再将这些较小的序列合成较大的序列
- #ifndef SHELLSORT_H
- #define SHELLSORT_H
- #include <iostream>
- using namespace std;
- /**
- * 交换两个元素的值
- */
- template<typename T> void swapT( T &lhs,T &rhs )
- {
- T temp=lhs;
- lhs=rhs;
- rhs=temp;
- }
- /**
- * shell排序类
- */
- template<typename T>
- class ShellSort{
- public:
- void shellSort( T*,int );
- void insertSort( T*,int,int );
- void printArr( T*,int );
- };
- /**
- * shell排序中使用的插入排序类
- * shell排序是基于插入排序的
- */
- template<typename T> void ShellSort<T>::insertSort( T *sortedArr,int arrLength,int delta )
- {
- for( int i=delta;i<arrLength;i+=delta )
- {
- for( int j=i;j>=delta;j-=delta )
- {
- if( sortedArr[j-delta]>sortedArr[j] )
- {
- swapT( sortedArr[j-delta],sortedArr[j] );
- }
- }
- }
- }
- /**
- * shell排序主函数
- * delta表示要排序数的间隔
- * 同时表示要排序的序列数
- * delta从arrLength/2开始到1结束
- */
- template<typename T> void ShellSort<T>::shellSort( T *sortedArr,int arrLength )
- {
- for( int delta=arrLength/2;delta>0;delta/=2 )
- for( int j=0;j<delta;++j )
- {
- this->insertSort( &sortedArr[j],arrLength-j,delta );
- }
- }
- template<typename T> void ShellSort<T>::printArr( T *sortedArr,int arrLength )
- {
- for( int i=0;i<arrLength;++i )
- {
- cout<<sortedArr[i]<<" ";
- }
- }
- #endif
- void ShellSort(int *a, int len)
- {
- int h = 1;
- while( h<len )
- h = 3*h + 1;
- while( h>0 )
- {
- for (int j=h; j<len; j++)
- {
- int key = a[j];
- int i = j-h;
- while( i>=0 && a[i]>key )
- {
- a[i+h] = a[i];
- i = i-h;
- }
- a[i+h] = key;
- }
- h = h/3;
- }
- }
From:http://blog.youkuaiyun.com/wang11chao01/article/details/7794075
From:http://blog.youkuaiyun.com/left_la/article/details/8656425