快速排序 归并排序的非递归版本 备忘
来源:互联网 发布:java web api接口开发 编辑:程序博客网 时间:2024/06/04 19:26
首先,归并排序,分治,递归解决小的范围,再合并两个有序的小范围数组,便得到整个有序的数组。
这是很适合用递归来写的,至于非递归,便是从小到大,各个击破,从而使得整个数组有序。代码如下:
void merge(vector<int> &A, int left, int mid, int right){ int i=left,j=mid+1; vector<int> tmp(right-left+1,0); int k=0; while(i<=mid&&j<=right) { if(A[i] < A[j]) tmp[k++]=A[i++]; else tmp[k++]=A[j++]; } while(i<=mid)tmp[k++]=A[i++]; while(j<=right)tmp[k++]=A[j++]; //write to A for(int i=0;i<right-left+1;++i) { A[left+i]=tmp[i]; }}void mergeSort(vector<int> &A){ const int n=A.size(); int step=1; int left=0,right,mid; while(step< n) { left=0; while(left+step<n) { mid=left+step-1; right=mid+step; if(right>=n) right=n-1; merge(A,left,mid,right); left=right+1; } step *= 2; }}
int partition(vector<int> &A, int left, int right){ int pivot=A[right]; int i=left; for(int k=left;k<right;++k) { if (A[k] < pivot) swap(A[i++],A[k]); } swap(A[i],A[right]); return i;}void quickSort(vector<int> &A){ stack<pair<int,int> > s; const int n = A.size(); if(n <2 ) return; int left=0,right=n-1; s.push(make_pair(left, right)); while(!s.empty()) { auto cur=s.top();s.pop(); left=cur.first;right=cur.second; if(left>=right)continue; int mid=partition(A,left,right); s.push(make_pair(left, mid-1)); s.push(make_pair(mid+1, right)); }}
写习惯了这两种排序的递归版本,此处的非递归版本确实不是那么自然而然的,但是只要记住递归的版本一定可以使用栈来模拟递归的过程,那么我们同样可以实现非递归的版本,此文就是一份备忘吧。
1 0
- 快速排序 归并排序的非递归版本 备忘
- 排序-归并排序(非递归版本)
- 非递归版本的快速排序
- 快速排序的非递归版本
- 非递归的归并排序
- 非递归的归并排序
- 非递归的归并排序
- 归并排序-bottom-up(非递归版本)
- 归并排序的递归版本
- 【排序】归并排序(递归和非递归版本)
- 【排序】快速排序及其非递归实现,归并排序详解
- 归并排序 非递归
- 归并排序非递归
- 归并排序(非递归)
- 归并排序(非递归)
- 非递归的快速排序
- 合并排序(归并排序)的递归和非递归
- 归并排序的非递归算法
- 简单DP
- 注解,反射在android View,Event中的奇妙实现
- 算法 - 动态规划
- Android 开发目录结构
- Java 单例实现四种方式
- 快速排序 归并排序的非递归版本 备忘
- quick-cocos2d-x游戏开发【1】——引擎结构总览和创建项目
- 图解MetaQ putMessage部分过程(一)
- 1408101010-ny-喷水装置(一)
- Android中采用XmlPullParser解析xml文件错误的有关问题
- 06-0. 混合类型数据格式化输入(5)
- LVS+Keepalived实现负载均衡
- 再说JTA和JTS
- IO - 同步,异步,阻塞,非阻塞 (转)