快速排序的递归和非递归实现方法
来源:互联网 发布:建筑外观效果图软件 编辑:程序博客网 时间:2024/05/16 19:36
快速排序的递归和非递归实现方法
/*快速排序的两种实现方法:1、递归实现 2、非递归实现*/ #include <iostream>#include<stack>using namespace std;//以a[0]作为枢轴,将数组分开 int partition(int a[],int left,int right){int temp=a[left];while(left<right){while(left<right&&a[right]>temp)right--;a[left]=a[right];while(left<right&&a[left]<temp)left++;a[right]=a[left];}a[left]=temp;return left;}//递归快排 void quicksort(int a[],int left,int right){if(left<right){int p=partition(a,left,right);quicksort(a,left,p-1);quicksort(a,p+1,right);}}//非递归快排:用栈来存储两端的位置void quickNonRecur(int a[],int left,int right){stack<int>s;//存储两端的位置if(left<right){int pos=partition(a,left,right);//第一次切分if(left<pos-1)//左边至少要有两个元素,若只有一个元素,则不用排了 {s.push(left);s.push(pos-1); } if(pos+1<right)//同理,右边也至少有两个元素。只有一个话的就自动有序了 { s.push(pos+1);//成对入栈 s.push(right); } while(!s.empty()) { int r=s.top();//每次必须是成对出栈 s.pop(); int l=s.top(); s.pop(); pos=partition(a,l,r); if(pos-1>l)//不是1,而是L{ s.push(l); s.push(pos-1);}if(pos+1<r){s.push(pos+1);s.push(r);} } } }void printArray(int a[],int n){int i=0;for(i=0;i<n;++i){if(i==0)printf("%d",a[i]);elseprintf(" %d",a[i]);}}int main(){int a[]={12,3,24,-21,32,13,4,5,2,67,10};int n=sizeof(a)/sizeof(a[0]);//quicksort(a,0,n-1);quickNonRecur(a,0,n-1); printArray(a,n);return 0;}
0 0
- 快速排序的递归和非递归实现方法
- 快速排序。冒泡排序递归和非递归的实现
- 快速排序的递归和非递归的实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序-递归和非递归的实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 快速排序的递归和非递归实现
- 归并排序的递归和非递归实现方法
- 【30】非递归方法实现快速排序
- 用非递归的方法实现快速排序
- 用非递归的方法实现快速排序
- 快速排序、冒泡排序、堆排序、shell排序的递归和非递归实现
- binder第一课
- description方法
- ubuntu svnserver 配置
- WebView的使用
- c++复习要点总结之九——继承二
- 快速排序的递归和非递归实现方法
- KMP算法的具体实现
- js中apply()和call()的区别
- Java千百问_03基本语法(005)_二进制是怎样做位运算的
- 《Android开发艺术探索》Android中的IPC方式--未完
- zjnu 1779 KRUŽNICE(线段树成段更新+离散化)
- insmod module.ko 出现Invalid parameters, dmesg显示信息:disagrees about version of symbol..
- Python的可视化工具概述
- 小学生算数问题