快速排序
2016-01-12 15:13
176 查看
#include <iostream> using namespace std; /* 算法思想 1.将数组首位元素作为划分基准t 2. 从后往前寻找小于 t的元素 交换之 3. 从前往后寻找大于等于 t的元素 交换之 4.填写基准元素 5.返回划分位置。 */ int partition(int *data,int l,int r){ int t=data[l]; while(l<r){ while(l<r&&data[r]>=t) --r; data[l]=data[r]; while(l<r&&data[l]<t) ++l; data[r]=data[l]; } data[l]=t; return l; } void quick_sort(int *data,int l,int r){ if(l<r){ int mid= partition(data,l,r); quick_sort(data,l,mid-1); quick_sort(data,mid+1,r); } } int main(){ int a[10]={34,1,56,3,24,5,6,3,8,0}; quick_sort(a,0,9); for(int i=0;i<10;++i) cout<<a[i]<<" "; return 0; }
解法二:
#include <iostream> #include <algorithm> #include <vector> using namespace std; /* 基准选择:data[left] data[center] data[right] 的值进行比较 1. data[left]=min(data[right],data[left],data[mid]) 2. data[right]=max(data[right],data[center],data[left]) 3. data[center]=median(data[left],data[right],data[center]) 4. 将data[center]放置在data[right-1] */ int median(vector<int> &data,int left,int right){ int center=(left+right)/2; if(data[left]>data[center]) swap(data[left],data[center]); if(data[left]>data[right]) swap(data[left],data[right]); if(data[center]>data[right]) swap(data[center],data[right]); swap(data[center],data[right-1]); return data[right-1]; } int partition(vector<int> &data,int left,int right){ int pivot=median(data,left,right); int i=left,j=right-1; while(1){ while(data[++i]<pivot){}//从data[left+1] while(data[--j]>pivot){}//从data[right-2] if(i<j) swap(data[i],data[j]); else break; } swap(data[i],data[right-1]); return i; } /*快速选择算法*/ void quick_select(vector<int> &data,int k,int left,int right){ if(left<right){ int mid=partition(data,left,right); if(k<mid) quick_select(data,k,left,mid-1); else if(k>mid) quick_select(data,k,mid+1,right); else return ; } } /*快速排序算法*/ void quick_sort(vector<int> &data,int left,int right){ if(left<right){ int mid=partition(data,left,right); quick_sort(data,left,mid-1); quick_sort(data,mid+1,right); } } int main(){ int d[]={1,2,3,2,2,2,5,4,2}; vector<int> data(d,d+9); // quick_select(data,8,0,8); //for(int i=0;i<9;++i) // cout<<data[i]<<" "; quick_sort(data,0,8); for(int i=0;i<9;++i) cout<<data[i]<<" "; return 0; }
相关文章推荐
- 火狐浏览器扩展不兼容问题解决
- 深入学习Struts2
- C Primer Plus(第五版)4
- UDP通信 Java
- MongoDB介绍
- 解决读取iphone名称中文乱码问题
- Nexus入门指南(图文)
- mysql ddl 的相关操作
- Android安全研究经验谈
- lua_state
- Nginx域名跳转
- MyBatis框架
- IDEA / WebStorm / PhpStorm 添加jQuery自动提示,自动补全,提示文档
- Android安全研究经验谈
- 程序员之网络安全系列(五):数字证书以及12306的证书问题
- python数字图像处理(8):对比度与亮度调整
- 1.2 Quartz 2D 内存管理
- [转]jQuery 读取 xml
- iOS 动态修改导航栏颜色 UINavigationBar
- Codeforces 456B Fedya and Maths 打表找规律