排序算法之希尔排序,快速排序

394 阅读2分钟

前言:最近将排序算法复习了一遍,写的可能不好,但为了加深印象下,便写下了这篇文章

希尔排序

int shell_sort(int *data, int length) {

	int gap = 0;//分组的跨度
	int i = 0, j = 0;

	for (gap = length / 2; gap >= 1; gap /= 2) { //分组的次数

		for (i = gap; i <= length; i++) { //对每组遍历

			for (j = i ; j >= gap ; j -= gap) { //组内排序

				if (data[j] < data[j - gap]) {
					swap(data[j], data[j - gap]);
				}
			}

		}
	}
}

第一步:确定分组的次数,上述图中一共12个元素,共分了3次组

下面这个for循环进行了3次

for (gap = length / 2; gap >= 1; gap /= 2)

第二步:对每个分组进行遍历

截取了gap=3的时候的此次遍历的情况,循环了9次

for (i = gap; i <= length; i++) { //对每组遍历

第三步:组内排序

for (j = i ; j >= gap && data[j - gap] > data[j]; j -= gap) { //组内排序
	swap(data[j], data[j - gap]);
}

这个组内排序是最为关键的地方,类似于插入排序,

取出相同颜色的元素,(设相同元素为a,b,c,d,)

将当前位置的元素(假设为c)一直和前一位元素(b)比较,

如果需要交换则交换前后两个元素的位置,(变为了a,c,b,d)

接着继续比较(a和c的比较)一直交换直到不需要交换为止

这次截取gap=3的时候且i=5的时候来进行分析

这次我们只要分析颜色为深紫的几个元素分析就可以了

快速排序

int quick_sort(int *data, int left, int right) {
//每一次递归, 每调用一次, 确定一个值得正确位置
	if (left >= right)
		return -1;

	int key = data[left];
	int lo = left, hi = right;

	while (lo < hi) {

		while (lo < hi && key < data[hi]) {
			hi--;
		}

		while (lo < hi && key > data[lo]) {
			lo++;
		}

		swap(data[lo], data[hi]);
	}

	//lo == hi
	data[lo] = key;
	quick_sort(data, left, lo - 1);
	quick_sort(data, lo + 1, right);

}

总代码

#include 
#define DATA_ARRAY_LENGTH 12

void swap(int &a, int &b) {
	int tmp = a;
	a = b;
	b = tmp;
	return ;
}

void print(int *data) {
	for (int i = 0; i < DATA_ARRAY_LENGTH; i ++) {
		printf("%4d", data[i]);
	}

	printf("\n");
}

int shell_sort(int *data, int length) {

	int gap = 0;//分组的跨度
	int i = 0, j = 0;

	for (gap = length / 2; gap >= 1; gap /= 2) { //分组的次数

		for (i = gap; i <= length; i++) { //对每组遍历

			for (j = i ; j >= gap && data[j - gap] > data[j]; j -= gap) { //组内排序
				swap(data[j], data[j - gap]);
			}

		}
	}
}

int quick_sort(int *data, int left, int right) {
//每一次递归, 每调用一次, 确定一个值得正确位置

	if (left >= right)
		return -1;

	int key = data[left];
	int lo = left, hi = right;

	while (lo < hi) {

		while (lo < hi && key < data[hi]) {
			hi--;
		}

		while (lo < hi && key > data[lo]) {
			lo++;
		}

		swap(data[lo], data[hi]);
	}

	//lo == hi
	data[lo] = key;
	quick_sort(data, left, lo - 1);
	quick_sort(data, lo + 1, right);

}

int quick_sort(int *data, int length) {
	quick_sort(data, 0, length - 1);
}

int main() {

	int i = 0;
	int data[DATA_ARRAY_LENGTH] = {23, 64, 24, 12, 9, 16, 53, 57, 71, 79, 87, 97};
#if 0
	shell_sort(data, DATA_ARRAY_LENGTH);
#else

	quick_sort(data, DATA_ARRAY_LENGTH);

#endif

	for (i = 0; i < DATA_ARRAY_LENGTH; i ++) {
		printf("%4d", data[i]);
	}

	printf("\n");
}