快速排序代码(选择最右值最为枢纽元)

来源:互联网 发布:内网yum服务器 编辑:程序博客网 时间:2024/06/11 14:41

        参考了《数据结构域算法分析》书上部分代码,结合自己的理解写出的快速排序程序。书上用三数中值分割法来选择枢纽元,有它的好处,但我觉得使得代码很多地方不够直观。我选择数组的最后一个元素作为枢纽元,然后实现了快排。

关于快排的原理可以去看我博客转载的文章,很直观:点击打开链接

快排的步骤就是:

1.选择枢纽元  

2.将小于枢纽元的数放前面,大于枢纽元的数放后面,枢纽元放中间 

                3.然后对枢纽元左右两个部分继续进行1和2  

下面程序中最主要的是Quicksort,实现了快排的原理,而子函数Qsort只是为了简洁的调用Quciksort而写的。Quicksort中有很多输出语句,只是为了把快排的每一个递归都显示出来,可以无视。

#include <iostream>using namespace std;void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;}void Quicksort(int a[], int Left, int Right){int i ,j;int Pivot = a[Right];   //选取数组最右的值为枢纽元if( Left < Right )      //读入a[]至少有两个数据才能进入后续步骤{i = Left;j = Right-1;        //由于最右为枢纽元,所以实际操作中的数组最右是Right-1for( ; ; ){while( a[i] < Pivot && i<Right ) {i++;}     // i<Right 防止越上界while( a[j] > Pivot && j>=Left ) {j--;}         // j > 0   防止越下界if( i < j ){swap( &a[i], &a[j] );i++;j--;for(int i=0;i<10;i++){cout<<a[i]<<' ';}cout<<endl;}elsebreak;}swap(&a[i], &a[Right]);for(int i=0;i<10;i++){cout<<a[i]<<' ';}cout<<endl;Quicksort(a, Left, i-1);Quicksort(a, i+1, Right);}}void Qsort(int a[], int N){Quicksort( a, 0, N-1 );}void main(){int a[10] = { 10, 6, 4, 8, 3, 9, 1, 5, 2, 7};int N = 10;cout<<"初始数组为:"<<endl;for (int i=0; i<10; i++){cout<<a[i]<<' ';}cout<<endl;cout<<"快排步骤及结果:"<<endl;Qsort( a, N );}
结果为:

              


0 0
原创粉丝点击