算法篇之快速排序

来源:互联网 发布:阿里云选择镜像 编辑:程序博客网 时间:2024/06/05 10:47
最近一直在学习java,昨天才弄完课程设计,做了一个简陋的计算器,进入收尾工作了。今天用c++实现了快速排序(久违了,c++......)

快速排序是排序算法的一种,基本思想是“照着标准挑石头”:假设有一列重量不等的石头,对其进行操作,想要得到的最终结果是这列石头按照重量递增的顺序排列。怎么做呢?首先,随意取其中的一块石头a1(假设取第一块)以其总量作为标准,在剩余的石头中,把比标准石头轻的放到它的左侧,把比标准石头重的放到它的右面,完成这个操作后得到这样的结果:a1的左侧全是比它轻的石头(假设为集合leftrock),a1的右侧全是比它重的石头(假设是集合rightrock)。下面该运用递归的思想,对于leftrock 选取其中一个(al1)作为标准,比al1轻的放到它的左面,比它重的放到它的右面;对rightrock执行同样的操作,然后还是递归了......

重点在执行一次挑石头时候具体怎么操作。下面以数组的形式表示一下。

假设有数组a[7]

下标  0 1 2 3 4 5 6

数值 3 7 4 6 1 5 2

          i->             <-j

以key=a[0]=3 为标准,从j开始往左遍历(感觉着样特别好,相当于a[0]的位置空出来了,要找一个数值填补a[0]的空缺,a[0]在左面,是相应的小值区域,所以要从右面往左遍历),把右面 ( 大值区域 )比a[0]小的值放到a[0]的位置上,这样,右面又空出来一个大值的位置,这时候要从左面开始找,把左面的比a1大的值放到那个空位上(因为大值的地盘在右面),依次重复,直到i和j相等,达到第一次操作的结果。

具体代码如下:

#include <iostream>using namespace std;void  SubQuickSort(int a[],int begin,int end){    int k=a[begin];    int i=begin;    int j=end;    static int count;    if(begin<end){       while(j>i){            while(a[j]>k&&j>i){--j;}            a[i]=a[j];            while(a[i]<k&&j>i){++i;}            a[j]=a[i];        }        a[j]=k;    }    cout<<"第"<<++count<<"次排序的结果是:";    for(int i=0;i<7;++i)    cout<<a[i];    cout<<endl;    if(j>begin&&j<end){    SubQuickSort(a,begin,j-1);    SubQuickSort(a,j+1,end);    }}int main(){    int a[7]={3,7,4,6,1,5,2};    SubQuickSort(a,0,6);    for(int i=0;i<7;++i)    cout<<a[i]<<" ";    return 0;}


 

 

 

原创粉丝点击