shell排序(shell sort)

基本概念

shell排序又叫缩小增量排序,其基本思路是:使用一个增量序列(h1, h2, ..., hn),其中h1 = 1。对应地有n趟对子序列(子序列由增量决定)的插入排序,第一趟增量为hn,第二趟为hn-1,……,依次递减。当增量为hk时排序结束后应确保对每一个i我们有a[i] ≤ a[i+hk]

shell的时间复杂度与增量序列选取有关,目前最优增量序列情况下,时间复杂度约为O(n^1.3)


shell排序的特点

  • 只要h1 = 1,任何增量序列都是可行的(若增量序列只含一个元素h1,则可看作退化为插入排序)
  • 一趟hk-排序就是对hk个独立的子数组各自执行插入排序
  • shell排序性能的一个重要因素是对增量序列的选择。常用的增量序列有:shell增量(h[n] = N/2, h[i] = h[i+1]/2),最坏情形运行时间为O(N^2);Hibbard增量(1, 3, 7, ……, 2^k - 1)的最坏情形运行时间为O(N^3/2);目前最优的增量序列是min{9*4^i - 9*2^i + 1, 4^i - 3*2^i + 1},即(1, 5, 19, 41, 109, ……)

代码
void shell_sort(int a[], int n){
	assert(a != NULL);
	assert(n > 0);

	int tmp;
	for(int inc = n/2; inc >= 1; inc /= 2){  //inc为增量
		for(int i = inc; i < n; i++){  //每趟有inc个子序列各自进行插入排序,这里统一进行
			tmp = a[i];
			int j = i-inc;
			while(j >= 0 && tmp < a[j]){
				a[j+inc] = a[j];
				j -= inc;
			}
			a[j+inc] = tmp;
		}
	}
}


你可能感兴趣的:(排序,Algorithm,shell)