快速排序

今天学习的快速排序算法的思想及代码实现,整理一些自己的学习心得。
快速排序(Quick Sort)的基本思想是:在一次排序的过程中先选取一个数组中的关键值,这个关键值可以是选择数组中的任意一个数,然后将比这个关键值小的数放在左边,大的数放在右边,在这个过程中关键值的位置是不断变化的,但是大小不变。一次遍历结束后以关键值最后位置将数组分左右两部分重复上述过程,即递归直到数组有序。
举个例子详细说明过程:
原始数据为:

012345678
501090307040806020

首先进行第一步:
选取关键值,从左右两边一起移动数据与关键值进行交换。

int left=0;
int right=8;
int key=a[0]; //这里选为数组的第1个数。

从右边开始,right向左边移动,遇到比关键值小的数a[8]=20;将值与关键值进行交换:

012345678
201090307040806050

同时从左边开始,left向右边移动,找到比关键值大的数a[3]=90,交换:

012345678
201050307040806090

继续重复:

012345678
201040307050806090

最后一步:

012345678
201040305070806090

此时将关键值的位置保存下来,以此位置为界限将数组成做有两部分重复上述过程,以上交换数据的代码为:

	while (left < right)
	{
		while (left < right && a[right] >= key)
		{
			right--;
		}
		std::swap(a[left], a[right]);
		while (left < right && a[left] <= key)
		{
			left++;
		}
		std::swap(a[left], a[right]);
	}

得到左右两个数组

0123
20104030
789
806090

具体的代码实现为:

#include "pch.h"
#include <iostream>
#include <algorithm>

void QuickSort(int a[], int left, int right)
{
	int start = left;
	int end = right;
	int key = a[left];
	if (left==right)
	{
		return;
	}
	while (left < right)
	{
		while (left < right && a[right] >= key)
		{
			right--;
		}
		std::swap(a[left], a[right]);
		while (left < right && a[left] <= key)
		{
			left++;
		}
		std::swap(a[left], a[right]);
	}
	if (left > start)
	{
		QuickSort(a, start, left - 1);
	}
	if (left < end)
	{
		QuickSort(a, left + 1, end);
	}
}
int main()
{
	int a[9] = { 50,10,90,30,70,40,80,60,20 };
	int left = 0;
	int right = 8;
	QuickSort(a, left, right); int i = 0;
	while (i < 9)
	{
		std::cout << a[i++] << ' ';
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值