第七章-排序 希尔排序

房东的猫 提交于 2020-08-18 07:12:56
#include <stdio.h>
#include "tool.h"

/*
	简单插入排序算法:
	1.把待排序序列按相等的间隔分成多个子序列,然后分别子序列进行排序
	2.开始间隔较大,在每轮排序后,逐步缩小间隔,直到间隔为1

	最差时间复杂度:O(N^(3/2))
*/
void shellSort(int a[], int len) {

	int s, D, P, i;
	int sw[] = {41,19, 5,2,1,0 };
	for (s = 0; sw[s] >= len; s++)
		;//初始增量不能超过待排序序列长度
	for (D = sw[s]; D > 0; D=sw[++s]) {//每个间隔执行一轮排序,直到间隔为1

		//执行插入排序
		for (P = D; P < len; P++) {
			int tmp = a[P];
			for (i = P; i >= D && a[i - D] > tmp; i -= D) {
				a[i] = a[i - D];
			}
			a[i] = tmp;
		}
	}
}

int main() {
	int a[10] = { 9,1,8,5,7,6,4,3,10,2 };
	int len = sizeof(a) / sizeof(a[0]);
	printf("排序前: ");
	printfArray(a, len);

	shellSort(a, len);

	printf("排序后: ");
	printfArray(a, len);

	return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!