快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
( 1 ) 首先设定一个分界值,通过该分界值将数组分成左右两部分。
( 2 ) 将大于等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时 ,
左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值。
( 3 ) 然后 , 左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值, 将
该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做
类似处理。
( 4 ) 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后, 再递归排
好右侧部分的顺序。当左、右两个部分各数据排序完成后 ,整个数组的排序也就完成了。
为了更清晰地理解快速排序算法的执行过程,这里
举一个实际数据的例子逐步执行快速排序算法。对 于 8 个整型数据69、 62、 89、 37、 97、17 、 28、 49,
这是一组无序的数据。对其执行快速排序过程,快速排序算法的执行步骤如下:
( 1 )首先选取一个分界值,这里选择第一个数据69 作为分界值。在变 量left中保存数组的最小序号0,变量 base中保存分界值69。
( 2 ) 从数组右侧开始,逐个取出数据与分界值69 比较,直到找到比69小的数据为止。这 里 ,
数组最右侧的元素的值49 就比 base变量中保存的值69 小。
( 3 ) 将 右 侧 比 base 小 的数 ( 数组元素a[right]中的数) 保存到a[left]( 即a[0])元素中。
( 4 ) 接 下 来, 从数组左侧开始, 逐个取出元素与分界值6 9 比较, 直到找到比 分界 值6 9 大的数
据为止。这 里 ,数组最左侧的元素a[left] ( 即a[0])的值为 4 9 , 比 base 的值 小 ,将left自 增 1 (值为 l ) o
再取a[left] ( 即 a[1])的值 6 2 与 base 的值 6 9 比较, 6 2 小 于 69, 继续 将 left 自 增 1 ( 值 为 2 )。
再取八化代] ( 即八[ 2])的值 8 9 与 6356比较,因 8 9 大 于 69,结束查找。
( 5 ) 将 左 侧 比 分 界 值 6 9 大 的 数 (数组元素a[2])保存到a[right] ( 即a[7])元素中。
( 6 ) 最后,将 分 界 值 69 中的值保存到a[left]中。
经过这一次分割,base 左侧的数比 分 界 值 6 9 小 ,而 base 右 侧 的数69大。
( 7 ) 接 下 来,通过递归调用,将base左侧的数据进行同样的排序,再将base右侧的数据进行同样的排序。
程序如下:
#include"stdafx.h"
#include<iostream>
using namespace std;
void quicksort(int a[],int left,int right)
{
if (left >= right)
return;
int i = left, j = right;
int base = a[i];
while (i<j)
{
while (i<j)
{
if (a[j] < base)
{
a[i] = a[j];
break;
}
else
j--;
}
while (i<j)
{
if (a[i] > base)
{
a[j] = a[i];
break;
}
else
i++;
}
}
if (i == j)
{
a[i] = base;
}
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
int main()
{
int num;
int i = 0;
cin >> num;//输入所要排序数的个数
int *a = new int[num];//动态分配一个数组,大小为num
while (cin >> a[i])
{
i++;
}
quicksort(a, 0, num-1);
for (i = 0; i < 8; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}