快速排序【模板】
来源:互联网 发布:动漫桌面主题下载软件 编辑:程序博客网 时间:2024/05/22 02:00
一、递归版本
手打递归版本
void quickSort(int *arr, int left,int right) { if(left>=right) return; int i=left,j=right; int standard = arr[left]; while(i<j) { //find some elements bigger than standard while( i<j && arr[i] < standard) ++i; //find some elements smaller than standard while( i<j && arr[j] > standard) --j; //exchange arr.i and arr.j swap(arr[i],arr[j]); } // i == j where the standard should be quickSort(a,left,i-1); quickSort(a,i+1,right);}
《数据结构理论与实践》版本:
int Partition(int *arr, int i,int j) { arr[0] = arr[i]; //arr[0] is a temp space while(i<j) { while(i<j && arr[j] >= arr[0]) --j; if( i < j) { //move the smaller element to the front arr[i] = arr[j]; ++i; } while(i<j && arr[i] < arr[0]) ++i; if( i < j) { //move the bigger element to the tail arr[j] = arr[i]; --j; } } arr[i] = arr[0]; return i;}void quickSort(int *arr, int left,int right) { int i; if(left<right) { i = Partition(arr,left,right); //divide the arr into 2 parts quickSort(arr,left,i-1); quickSort(arr,i+1,right); }}
上面的版本都会有TLE
递归改进版(poj 2623 AC):
void quickSort(int *arr, int left, int right){ int i = left, j = right; int mid = arr[(i+j)/2]; while(i <= j){ while(arr[i] < mid) i ++; while(arr[j] > mid) j --; if(i <= j){ int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i ++; j --; } } if(i < right) quickSort(arr,i, right); if(left < j) quickSort(arr,left, j);}
二、非递归版本
/**使用栈的非递归快速排序**/template<typename Comparable>void quicksort2(vector<Comparable> &vec,int low,int high){ stack<int> st; if(low<high){ int mid=partition(vec,low,high); if(low<mid-1){ st.push(low); st.push(mid-1); } if(mid+1<high){ st.push(mid+1); st.push(high); } //其实就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作 while(!st.empty()){ int q=st.top(); st.pop(); int p=st.top(); st.pop(); mid=partition(vec,p,q); if(p<mid-1){ st.push(p); st.push(mid-1); } if(mid+1<q){ st.push(mid+1); st.push(q); } } }}
1 0
- 【排序】快速排序模板
- 【排序】快速排序模板
- 快速排序模板
- 快速排序模板
- C++快速排序模板
- C++快速排序模板
- 快速排序(模板)
- 快速排序【模板】
- 快速排序模板
- 快速排序----模板实现
- 快速排序函数模板
- 快速排序模板
- 快速排序【模板】
- 【模板】快速排序
- P1177 【模板】快速排序
- 【模板】快速排序
- 快速排序模板
- 洛谷 [模板]快速排序
- 23.数据类型和sizeof运算符
- [BZOJ 3439]Kpm的MC密码
- 网络流建模总结
- 补间动画 http://www.sunnyos.com/
- c++四种分配内存的方法整理
- 快速排序【模板】
- C++ 对象模型(二)
- Android 微信支付总结
- 配置MySQL的Path变量
- 4448: [Scoi2015]情报传递 dfs序+主席树
- 属性动画
- iOS开发UI篇—CAlayer(自定义layer)
- iOS开发UI篇—CAlayer(创建图层)
- 4448: [Scoi2015]情报传递|主席树|离线操作