阅读 209

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

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

希尔排序

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");
}


作者:长烟
链接:https://juejin.cn/post/7037473904159359006

伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐