数据结构之希尔排序

  希尔排序又称为“缩小增量排序”,它是对直接插入排序方法的改进。
  希尔排序的基本思想是:先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。具体做法是:先取一个小于 n 的整数 d1 作为第一个增量,把文件的全部记录分成 d1 个组,即将所有距离 d1 倍数序号的记录放在同一个组中,在各组内进行直接插入排序;然后取第二个增量 d2(d21),重复上述分组和排序工作,依此类推,直到所取的增量 di=l(dii-1<···21),即所有记录放在同一组进行直接插入排序为止。
  当增量序列为“5,3,1”时,希尔插入排序过程如下。
数据结构之希尔排序_第1张图片

  【函数】用希尔排序方法对整型数组进行非递减排序。

void ShellSort(int data[], int n)
{
	int *delta, k, i, t, dk, j;
	k=n;
	/*从k=n 开始,重复 k=k/2 运算,直到k等于1,所得k值的序列作为增量序列存入 delta*/
	delta = (int *)malloc(sizeof(int)*(n/2));
	i= 0:
	do{
		k = k/2;	delta[i++]= k;
	}while(k > 1);
	i= 0:
	while ((dk = delta[i])>0){
		for(k = delta[i]; k < n; ++k)
			if (data[k] < data[k-dk]){			/*将元素 data[k]插入到有序增量子表中*/
				t= data[k];						/*备份待插入的元素,空出一个元素位置*/
				for(j = k-dk; j>=0 && t< data[j]; j-=dk)
					data[j+dk] = data[j];		/*寻找插入位置的同时元素后移*/
				data[i+dk] = t;					/*找到插入位置,插入元素*/
			}/*if*/
		++i;										/*取下一个增量值*/
	}/*while*/
}/*ShellSort*/

  希尔排序是一种不稳定的排序方法,据统计分析其时间复杂度约为 O(n1.3),在排序过程中仅需要一个元素的辅助空间用于数组元素值的交换,空间复杂度为 O(1)。

你可能感兴趣的:(数据结构,数据结构,排序算法,算法)