常見排序算法5--shell排序

shell排序是一種優化的插入排序算法,其思想是將待排序列分紅若干組,而後對每組分別進行插入排序;而後不斷減少分組增量到1,即完成排序過程。算法

具體看下面吧。shell

shell_sort.h函數

/************************************************************************/
/* 希爾排序又稱「縮小增量排序」,是對直接插入排序算法的改進                                                 */
/* 希爾排序的思想是,先將整個待排記錄分紅若干序列,而後分別進行直接插入排序*/
/*具體作法以下先取一個小於n的增量d1做爲第一個增量,即將全部距離d1的元素分紅一組*/
/*因而n分紅以下d1組*/
/*0,d1,2*d1,3*d1.......k*d1 */
/*1,1+d1,1+2*d1.。。。。。*/
/*也就是begin,begin + d1 , 。。。。。begin + k * d1 < n  , begin {0,d1-1}*/
/*經過屢次d排序,便可*/
/************************************************************************/

/*
*a爲待排序列,length爲長度,increment_sector爲增量因子,就是增量d如何取得
*實驗結果increment_sector =3時,shell_sort時間複雜度最小及n的1.3次方
*/
void shell_sort(int a[], int length, int increment_sector);

/*
*該函數是對插入排序的改進
*a爲待排序列,length爲長度,begin爲組別第一個的下標,step爲分組中兩個元素下標距離也就是增量d
*/
void insert_sort_step(int a[],int length, int begin, int step);

shell_sort.cpp優化

 

#include "Shell_Sort.h"

/*
*a爲待排序列,length爲長度,increment_sector爲增量因子,就是增量d如何取得
*實驗結果increment_sector =3時,shell_sort時間複雜度最小及n的1.3次方
*/
void shell_sort(int a[], int length, int increment_sector){

	//須要屢次增量插入排序,直到增量爲1,進行全排
	for (int step = length / increment_sector; step > 0; step = step / increment_sector )
	{
		//對每一個增量分組進行插入排序分組下標:begin + step * k  < n; 
		for (int begin = 0; begin < step; begin++)
		{
			insert_sort_step(a,length,begin,step);
		}
		
	}
}
/*
*該函數是對插入排序的改進
*a爲待排序列,length爲長度,begin爲組別第一個的下標,step爲分組中兩個元素下標距離也就是增量d
*直接插入排序只需令begin = 0; step = 1;
*/
void insert_sort_step(int a[],int length, int begin, int step){
	//執行插入排序
	for (int i = begin + step; i < length; i = i + step)
	{
		int key = a[i];
		//下面爲元素i尋找合適的位置
		for ( int j = begin; j < i; j += step)
		{
			if ( a[i] < a[j])//找到a[i]的位置,即爲j,j以後的元素後移
			{
				for( int k = i; k > j; k = k - step)
				{
					a[k] = a[k -step];
				}
				a[j] = key;
			}
		}
		/*
		關於插入排序有兩種方式,一是上面那樣從最前面向後查找,二是以下從後向前查找
		*/
		/*
	   int j = i - step;
	   int key = a[j];
		while(j > -1 && a[j] > key){ //此處爲升序排列
		a[j + step] = a[j];         //元素後移
		j -= step;
		}
		a[j+step] = key;              //找到位置,插入便可
		*/
		
	}
}