C/C++_七大排序算法_快速排序

快速排序

接上面的故事未完待续, 除了归并长老外, 还有另外一位快速长老的快速大法也是被小小桂子赞不绝口, 大呼奇妙! 这位快速长老的算法思想时这样的:

1、每次选取第一个数为基准;
2、然后使用 “乾坤大挪移” 将大于和小于基准的元素分别放置于基准数两边;
3、继续分别对基准数两侧末端未排序的数据使用分治法进行细分处理, 直至整个序列有序.

对于下面待排序的数组;
在这里插入图片描述
第一步: 先选择第一个数 163 为基准数, 以 163 为基准将小于它的数排在它前面, 大于等于他的数排在其后, 结果如下:

在这里插入图片描述
此处, 快速长老介绍具体排序数据的步骤
1、确认 163 为基准数后, 先把 163 从数组中取下来
在这里插入图片描述
2、然后从最右开始, 查找小于基准数 163 的数, 找到 162 , 将其移至空出来的元素中
在这里插入图片描述
3、接下来, 从最左边未处理的元素中从左至右扫描比基数 163 大的数, 将其移动至右侧空出来的元素中
在这里插入图片描述
4、接下来, 继续从最右边未处理的元素中从右至左扫描比基数 163 小的数, 将其移动至左侧空出来的元素中
在这里插入图片描述
接下来再重复执行步骤3, 171执行右移
在这里插入图片描述
重复执行步骤4, 此时右边的值已经均大于基数(163), 左边的值均已小于基数
在这里插入图片描述
接下来我们将基数(163)保存回黄色空格中
在这里插入图片描述

第二步: 采用分治法分别对基数左边和右边的部分运用第一步中的方法进行递归操作, 直到整个数组变得有序, 以左边的数组为例:
在这里插入图片描述
选择 162 为基数, 运用 “乾坤大挪移大法” 得到结果如下:
在这里插入图片描述
以 162 为界, 把数组分成两个部分, 此时, 基数右侧已经没有数据, 所以, 接下来只要继续对左侧的数组分治处理即可, 选择 159 为基数, 再次运用 “乾坤大挪移大法” 得到结果如下:
在这里插入图片描述
参考:

#include <stdio.h>
#include <stdlib.h>


int partition(int arr[], int low, int high)
{
	int i = low;
	int j = high;
	int base = arr[low];

	if (low < high)
	{
		while (i < j)
		{
			while (i < j && arr[j] >= base)
			{
				j--;
			}

			if (i < j) /* 右边已经找到小于基数的数 */
			{
				arr[i++] = arr[j];
			}

			while (i < j && arr[i] < base)
			{
				i++;
			}

			if (i < j) /* 左边已经找到大于基数的数 */
			{
				arr[j--] = arr[i];
			}
		}

		arr[i] = base;
	}

	return i;
}

/* 实现快速排序 */
void QuickSort(int* arr, int low, int high)
{
	if (low < high)
	{
		int index = partition(arr, low, high);

		QuickSort(arr, low, index - 1);
		QuickSort(arr, index + 1, high);
	}
}


int main()
{
	int arr[] = { 163,161,158,165,171,170,163,159,162 };
	int len = sizeof(arr) / sizeof(arr[0]);
	
	/*int index = partition(arr, 0, len - 1);
	printf("分区完毕, 基数下标: %d\n", index);*/

	QuickSort(arr, 0, len - 1);

	printf("执行快速排序后的结果: \n");
	for (int i = 0; i < len; i++)
	{
		printf(" %d", arr[i]);
	}
	printf("\n");


	system("pause");
	return 0;
}

运行环境: vs 2019
运行结果:
在这里插入图片描述

结语:

学到的知识要, 多复习, 多总结, 多敲. 需要时间的积累, 才能引起质的改变. 自己写不出来的永远是别人的.

分享一下我的技巧: 代数法把具体的数字带进去, 看看能能能找到规律(掌握思想).
还有就是画图, 也很重要. 用笔画出来, 把数代进去, 方法虽然笨, 但真的很实用, 好记忆不如烂笔头!!! 还有多用debug(调试工具)

我是小白, C/C++功力…, 你懂得, 写的文章可能不是很好. 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug, 谁没错过!!!

最近学操作系统我认为, 学什么都要成本(时间), 即使它是免费的, 我个人认为要挑来学, 挑重点来学, 而不是从头到尾, 除非考试考研.

这个知识点我没有完全掌握(4/10), 革命尚未成功, 同志还需努力!!! , 我会回来反复复习的

今日是: 2020年5月17日, (由于疫情的原因)现在没有返校. 写博客,也可自己加强记忆,就当写写日记吧!!!

希望给个赞: 反正你又不亏, 顺便而已

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值