Quicksort快速排序算法

快速排序算法

思想:二分法,分治法,递归

排序实例
6 1 2 7 9 3 4 5 10 8
6为基准,也就是temp
先从右找第一个比基准数小的,再从左找第一个比基准数大的,进行交换,这里必须从右边先找的原因是因为基准数定的是最左的数。

如果选取最左边的数a[left]作为基准数,那么先从右边开始可保证i,j在相遇时,相遇数是小于基准数的,交换之后temp所在位置的左边都小于temp。但先从左边开始,相遇数是大于基准数的,无法满足temp左边的数都小于它

找到7 和 5
6 1 2 7 9 3 4 5 10 8


交换后得到
6 1 2 5 9 3 4 7 10 8


依次类推,当得到 i == j 或 i > j时,排序无法继续进行,此时情况如下
6 1 2 5 4 3 9 7 10 8


此时交换基准数与3
3 1 2 5 4 6 9 7 10 8


这样就保证了基准数6左边都比他小,右边都比他大
这时,再将3设为基准数,在3 1 2 5 4 中进行快速排序,在9 7 10 8中进行快速排序
也就是进行递归排序算法,最终就得到排序结果
1 2 3 4 5 6 7 8 9 10


#include <iostream>

using namespace std;

void QuickSort(int* a, int left, int right) 
{
	int i = left;
	int j = right;
	int temp = a[left];
	int t = 0;
	if (left >= right)
		return;
	while (i != j)
	{
		while (i < j && a[j] >= temp)//a[j]<temp跳出循环,找到第一个a[j]<temp
			j--;//从右向左找第一个小于x的数
		while (i < j && a[i] <= temp)//a[i]>temp跳出循环,找到第一个a[i]>temp
			i++;//从左向右找第一个大于x的数

		//交换两个数在数组中的位置
		if (i < j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//将基准数归位
	a[left] = a[i];
	a[i] = temp;
	QuickSort(a, left, i - 1);
	QuickSort(a, i + 1, right);
	return;
}

int main()
{
	int n;
	int a[101] = {0};
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	QuickSort(a, 0, n-1);

	for (int i = 0; i < n; i++) {
		cout << a[i] << ' ';
	}
	return 0;
}

测试用例:

Input:
11
3 4 5 1 34 61 22 41 111 2 87

Output:
1 2 3 4 5 22 34 41 61 87 111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值