03 快速排序(quick sort)

 快速排序(quick sort

程序代码

#include <bits/stdc++.h>
using namespace std;
void quickSort(int* a, int left, int right) {

	if (left > right) return;

	int i = left, j = right;

	int temp = a[i]; //选取基准数

	while (i != j) { //交换中间的数
		while (i < j && temp <= a[j]) j--;
		while (i < j && temp >= a[i]) i++;
		if (i < j) {                   //交换两个数
			int t = a[j];
			a[j] = a[i];
			a[i] = t;
		}
	}
	//交换基准数
	if (i == j) {
		a[left] = a[i];
		a[i] = temp;
	}


	quickSort(a, left, i - 1);
	quickSort(a, i + 1, right);
}
int main() {
	int a[10], n = 0;
	memset(a, 0, sizeof(a));
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	quickSort(a, 1, n);

	for (int i = 1; i <= n; i++) cout << a[i] << " ";

	return 0;
}

代码解释

快速排序是可以跳转进行两个数的交换,将数列划分为两个一大一小的子数列(分治),子数列继续划分,直到剩余一个数为止,这一点区别与冒泡排序。

程序从需要排序的数列中选择第一个数作为基准数,设置两个下标,分别指向数列的左端和右端,右端开始向左侧移动,找到比基准数小的数停止,左端开始向右移动,找到比基准数大的数停止,

交换两个数

 

 此处需要注意,while循环停止有可能是找到了大数和小数,也有可能没有找到(左端下标与右端下标重合)如果重合,就不需要交换两个数了。上面两段程序实现了两个数的寻找与交换,但是我们需要将所有的数进行比较交换,直到再没有符合要求的数。

上面的程序执行完成就实现了数列的全部数的交换,但是基准数还在最开始的地方,这是我们需要将基准数与当前指向的数进行交换(当前i和j重合,肯定是由于右端移动导致的,而右端移动要嘛找到了小数,要嘛与没有移动的右端重合,此时右端指向基准数,交换没有毛病)

递归对中间数(基准数)的左端和右端数列进行同样的操作,直到剩余一个数停止

算法概念

快速排序的整体思路是 分治与递归

动画演示(一次)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值