快速排序-QuickSort
2015-08-25 17:57
537 查看
快速排序主要应用了分治的思想。
分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解
分治模型在每一层递归上都有三个步骤:
-分解(Divide):将原问题分解成一系列子问题。
-解决(Conquer):递归的解各个子问题。若子问题足够小,则直接求解。
-合并(Combine):将子问题的结果合并成原问题的解。
//分治的分解和合并:quickSort递归调用
……
//quickSort变成非递归
方法一、用栈模拟递归
方法二、用数组模拟栈,从而实现递归
分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解
分治模型在每一层递归上都有三个步骤:
-分解(Divide):将原问题分解成一系列子问题。
-解决(Conquer):递归的解各个子问题。若子问题足够小,则直接求解。
-合并(Combine):将子问题的结果合并成原问题的解。
快速排序的递归方法:
//分治的解决部分:partition函数int partition(vector<int> &vec,int low,int high){ int comp=vec[low]; while(low<high){ while(low<high && vec[high] >= comp){ high--; } vec[low]=vec[high]; while(low<high && vec[low] <= comp){ low++; } vec[high]=vec[low]; } vec[low]=comp; return low; }
//分治的分解和合并:quickSort递归调用
void quickSort(vector<int> &vec,int low,int high){ if(low < high) { int middle = partition(vec, low, high); quickSort(vec, low, middle - 1); quickSort(vec, middle + 1, high); } }
快速排序的非递归方法:
//partition函数不变……
//quickSort变成非递归
方法一、用栈模拟递归
void quickSort(vector<int> &vec,int low,int high){ stack<int> st; int middle,l,h; if(low<high){ st.push(low); st.push(high); } while(!st.empty()){ h = st.top(); st.pop(); l = st.top(); st.pop(); middle = patition(vec, l, h); if(l<middle-1){ st.push(l); st.push(middle-1); } if(middle+1 < h){ st.push(middle+1); st.push(h); } } }
方法二、用数组模拟栈,从而实现递归
void quickSort(int *a, int l, int h){ if (l>=h) return; int *s = new int[h-l+1]; //实现栈够用,因为存储的l,h索引在数组a的长度以内 int p = 0; s[p++] = l; s[p++] = h; int low,high,mid; while (p>0){ high = s[--p]; low = s[--p]; if(low<high) { mid = partition(a, low, high); if(low < mid-1){ s[p++] = low; s[p++] = mid -1; } if(mid+1 < high){ s[p++] = mid+1; s[p++] = high; } } } delete []s; }
相关文章推荐
- 快速排序
- C#中的递归APS和CPS模式详解
- C#快速排序算法实例分析
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C++快速排序的分析与优化详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- Javascript递归打印Document层次关系实例分析
- php简单实现快速排序的方法
- Java 快速排序(QuickSort)原理及实现代码
- 快速排序和分治排序介绍
- java 算法之快速排序实现代码
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- Python:打印某个路径下的所有文件