分治算法实现快速排序
来源:互联网 发布:房地产知乎 编辑:程序博客网 时间:2024/06/05 16:34
基本思想
分治算法,Divide-and-conquer algorithms;
实现快速排序的主要步骤:
1、找到轴值,将其固定在第一位或者最后一位,用来比较。
2、分割以轴值为中间数的数组
3、分别递归轴值的左边和右边
第一种方法:取两端的数作为轴数;如:将最后一位数作为轴数,将数组分割。
int PartitionLast(std::vector< int > &arry,int left,int right){ int lindex=left,rindex=right;//left and right can't use immediately; int pivot=arry[right];//将最后一个数作为轴数,临时保存 while(lindex!=rindex) { while(arry[lindex]<=pivot && lindex<rindex) ++lindex; if(lindex<rindex) arry[rindex--]=arry[lindex]; while(arry[rindex]>=pivot && rindex>lindex) --rindex; if(rindex>lindex) arry[lindex++]=arry[rindex]; } arry[lindex]=pivot; return lindex;}
第二种方法:随机取数,作为轴数。
int const PivotRand(std::vector< int > &arry, int left ,int right){ int randomIndex =rand()%(right-left)+left;//取数组中随机下标 return randomIndex;}
第三种方法:取中间数。即获取数组第一位,中间位,最后一位,比较三者的大小,将三者中排在中间的数最为轴数。
int const PivotThree(std::vector< int > &arry,int left,int right){ int middle=(right+left)/2; if(arry[left]>arry[right]) std::swap(arry[left],arry[right]); if(arry[middle]>arry[right]) middle=right; else if(arry[middle]<arry[left]) middle=left; return middle;}
以下是实现三种方法的源代码,IDE为CodeBlocks;
#include<iostream>#include <vector>#include<stdio.h>#include <algorithm>//No1 固定基准元int PartitionLast(std::vector< int > &arry,int left,int right){ int lindex=left,rindex=right;//left and right can't use immediately; int pivot=arry[right]; while(lindex!=rindex) { while(arry[lindex]<=pivot && lindex<rindex) ++lindex; if(lindex<rindex) arry[rindex--]=arry[lindex]; while(arry[rindex]>=pivot && rindex>lindex) --rindex; if(rindex>lindex) arry[lindex++]=arry[rindex]; } arry[lindex]=pivot; return lindex;}//No.2随机取基准元int const PivotRand(std::vector< int > &arry, int left ,int right){ int randomIndex =rand()%(right-left)+left;//取数组中随机下标 return randomIndex;}int PartitionRand(std::vector< int > &arry,int left,int right){ int const index=PivotRand(arry,left,right); std::swap(arry[index],arry[right]); int const pivot=arry[right]; int lindex=left,rindex=right; while(lindex!=rindex) { while(arry[lindex]<=pivot && lindex<rindex) ++lindex; if(lindex<rindex) arry[rindex--]=arry[lindex]; while(arry[rindex]>=pivot && rindex>lindex) --rindex; if(rindex>lindex) arry[lindex++]=arry[rindex]; } arry[lindex]=pivot; return lindex;}//No.3三数取中int const PivotThree(std::vector< int > &arry,int left,int right){ int middle=(right+left)/2; if(arry[left]>arry[right]) std::swap(arry[left],arry[right]); if(arry[middle]>arry[right]) middle=right; else if(arry[middle]<arry[left]) middle=left; return middle;}int PartitionMiddle(std::vector< int > &arry,int left,int right){ int const index=PivotThree(arry,left,right); std::swap(arry[index],arry[right]); int const pivot=arry[right]; int lindex=left,rindex=right; while(lindex!=rindex) { while(arry[lindex]<=pivot && lindex<rindex) ++lindex; if(lindex<rindex) arry[rindex--]=arry[lindex]; while(arry[rindex]>=pivot && rindex>lindex) --rindex; if(rindex>lindex) arry[lindex++]=arry[rindex]; } arry[lindex]=pivot; return lindex;}void QuickSort(std::vector< int > &arry,int left,int right){ if(right<=left) return; //int pivot=PartitionLast(arry,left,right); //int pivot=PartitionMiddle(arry,left,right);//分别实现 int pivot=PartitionRand(arry,left,right); QuickSort(arry,left,pivot-1); QuickSort(arry,pivot+1,right);}int main(){ std::vector< int > arry{2,4,7,8,9,10,11,12,23,1}; int left=0; int right=arry.size()-1; QuickSort(arry,left,right); for(auto i:arry) std::cout<<i<<" "; return 0;}
下面这个链接有更详细的解说:三种快速排序算法以及快速排序的优化
0 0
- 分治算法实现快速排序
- 算法中分治策略实现快速排序
- 分治法实现快速排序算法
- 分治算法-快速排序
- 分治算法----快速排序
- 快速排序-分治算法
- 分治算法---快速排序
- 分治算法 快速排序
- 分治算法之快速排序
- 分治算法之快速排序
- 分治法-----快速排序算法
- 分治算法之快速排序
- 快速排序算法-分治思想
- 分治算法之快速排序
- 分治算法之快速排序
- 快速排序分治算法解析
- 分治算法之快速排序
- 快速排序(分治算法)
- NOIP提高组【JZOJ4797】就是乘法
- 2016 ICPC 北京网络赛C题A Simple Job,hiho1385 : A Simple Job
- UITableView Section 不悬停
- spring源码 - xm配置解析
- android轮播图封装 (网络图片glide解析,手势触摸,三种viewpager切换效果等等)
- 分治算法实现快速排序
- HTMl5的存储方式sessionStorage和localStorage详解
- 关于Java读取文件操作时路径中的斜杠问题
- 4-2 电子时钟中的运算符重载
- Android Studio常用快捷键大全
- CentOS6.x 源码编译安装Git
- 2016 ICPC 北京网络赛F题Periodic Signal,hiho1388 : Periodic Signal
- Android悬浮缩放菜单的实现【转】
- java基础(二)-数据类型