首页 > 代码库 > 快速排序代码(选择最右值最为枢纽元)
快速排序代码(选择最右值最为枢纽元)
参考了《数据结构域算法分析》书上部分代码,结合自己的理解写出的快速排序程序。书上用三数中值分割法来选择枢纽元,有它的好处,但我觉得使得代码很多地方不够直观。我选择数组的最后一个元素作为枢纽元,然后实现了快排。
关于快排的原理可以去看我博客转载的文章,很直观:点击打开链接
快排的步骤就是:
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-1 for( ; ; ) { while( a[i] < Pivot && i<Right ) {i++;} // i<Right 防止越上界 while( a[j] > Pivot && j>0 ) {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; } else break; } 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 ); }结果为:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。