今天学习的快速排序算法的思想及代码实现,整理一些自己的学习心得。
快速排序(Quick Sort)的基本思想是:在一次排序的过程中先选取一个数组中的关键值,这个关键值可以是选择数组中的任意一个数,然后将比这个关键值小的数放在左边,大的数放在右边,在这个过程中关键值的位置是不断变化的,但是大小不变。一次遍历结束后以关键值最后位置将数组分左右两部分重复上述过程,即递归直到数组有序。
举个例子详细说明过程:
原始数据为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
50 | 10 | 90 | 30 | 70 | 40 | 80 | 60 | 20 |
首先进行第一步:
选取关键值,从左右两边一起移动数据与关键值进行交换。
int left=0;
int right=8;
int key=a[0]; //这里选为数组的第1个数。
从右边开始,right向左边移动,遇到比关键值小的数a[8]=20;将值与关键值进行交换:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 90 | 30 | 70 | 40 | 80 | 60 | 50 |
同时从左边开始,left向右边移动,找到比关键值大的数a[3]=90,交换:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 50 | 30 | 70 | 40 | 80 | 60 | 90 |
继续重复:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 40 | 30 | 70 | 50 | 80 | 60 | 90 |
最后一步:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 40 | 30 | 50 | 70 | 80 | 60 | 90 |
此时将关键值的位置保存下来,以此位置为界限将数组成做有两部分重复上述过程,以上交换数据的代码为:
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]);
}
得到左右两个数组
0 | 1 | 2 | 3 |
---|---|---|---|
20 | 10 | 40 | 30 |
7 | 8 | 9 |
---|---|---|
80 | 60 | 90 |
具体的代码实现为:
#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++] << ' ';
}
}