您的位置:首页 > 编程语言 > C语言/C++

C/C++ 快速排序算法

2015-08-10 11:03 211 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Wonder_G/article/details/47395689

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
( 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;
}

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: