快速排序算法的基本内容:选择一个基准数,然后结合分治法,把数据分为两个部分,如果你想要数据升序排列,那么基准数左边就需要比基准数小,基准数右边就需要比基准数大,如果是降序排列则相反。接下来基准数左右两边数据继续使用快速排序进行排序(一般使用递归),当左边数据或右边数据只剩一个元素时,则说明排序完成。下面我们结合具体数据来说明一下。
将下面这组数据由小到大进行排列.
1.首先我们先选择一个基准数(base)通常是数据的第一位,也就是4,下标(baseindex)为0;
2.然后开始比较,规则如下:
(1)从右(right=4)开始向左遍历,找到一个比基准数小的数据,找到之后发现right=3,
data[right]=2;然后把该项数据取走放入基准数所对应的数据项(data[baseindex]=data[right])。如下图
(2)然后,从左(left=0)开始向右遍历,找到一个比基准数大的数据,找到之后发现left=2,
data[left]=5;然后把该项数据取走放入data[right],所对应的数据项(data[right]=data[left]),由(1)可知right=3。如下图
(3)从右(right=3)开始向左遍历,我们发现当right>left的情况下,找不到比基准数小的数据。right减1,此时right=left=2为基准元素所在位置,由(2)可知left=2。如下图
此时我们发现一趟快排完成后,虽然数据还是无序的但基准数base(4)的左边都是小于它,右边都大于它。接着我们继续对
和
进行快速排序,直到排序的数据个数等于1则停止排序。
代码如下:
#include <iostream>
//start要排数据的开始索引,end要排数据的结尾索引
void KuaiSort(int data[], int start, int end)
{
//如果只剩一个元素则停止递归
if (start-end!=1)
{
int right{}, left{};
left = start;//左起点
right = end;//右终点
int base = data[start];//基准元素
while (right>left)
{
//从最右端开始遍历
while (right>left)
{
//找到比基点元素小的元素,填入left的位置
if (data[right]<base)
{
data[left] = data[right];
break;
}
else
{
right--;
}
}
//从最左端开始遍历
while (right > left)
{
//找到比基准元素大的元素,填入right的位置
if (data[left] > base)
{
data[right] = data[left];
break;
}
else
{
left++;
}
}
}
//一趟快排结束,right=left以变为中间位置,放入基准元素
data[right] = base;
KuaiSort(data, start, left - 1);//把中间位置的左边元素再进行快速排序
KuaiSort(data, right + 1, end);//把中间位置的右边元素再进行快速排序
}
}
int main()
{
int arry[] = { 4,3,1,2,6 };
KuaiSort(arry, 0, 4);
for (int i = 0; i < 5; i++)
{
std::cout << arry[i] << "\t";
}
}