C/C++希尔排序--(knuth序列法)

时间: 2020-06-19 20:25

void shellSort(int* arr, int len) {//传入数组名和数组大小
	int h = 1;	
	while (h <= len/3) {	//knuth序列 h = 1; h = 3*h + 1
		h = h * 3 + 1;
	}

	for (int gap = h; gap > 0; gap = (gap - 1)/3) {//控制间隔的大小

		//以下两个循环和一般插入排序一样
		for (int j = gap; j < len; ++j) {
			for (int k = j; k > gap - 1; k -= gap) {
				if (arr[k] < arr[k - gap]) {
					arr[k] = arr[k] ^ arr[k - gap];
					arr[k - gap] = arr[k] ^ arr[k - gap];
					arr[k] = arr[k] ^ arr[k - gap];
				}
			}
		}
	}
}
void shellSort(int* arr, int len) {//传入数组名和数组大小
	int h = 1;	
	while (h <= len/3) {	//knuth序列 h = 1; h = 3*h + 1
		h = h * 3 + 1;
	}

	for (int gap = h; gap > 0; gap = (gap - 1) / 3) {//控制间隔的大小

		//以下两个循环和一般插入排序一样
		for (int j = gap; j < len; ++j) {
			int curValue = arr[j];	//记录当前节点的值
			int lastIndex = j - gap;	//记录当前节点的前一个节点的下标

			while (lastIndex >= 0 && curValue < arr[lastIndex]) {	//对当前节点的前面节点进行移位
				arr[lastIndex + gap] = arr[lastIndex];	//符合移位的节点后移一个间隔
				lastIndex -= gap;	//标记前移一个间隔继续判断
			}

			arr[lastIndex + gap] = curValue;	//插入最终位置
		}
	}
}

你可能感兴趣的:(C/C++希尔排序--(knuth序列法))