快速排序的Hoare划分
来源:互联网 发布:淘宝联盟手机可以提现 编辑:程序博客网 时间:2024/05/18 02:24
在《算法导论》中有介绍到快排的原始划分方法——Hoare划分,在算导7.1节中给出的快排经典算法中,将主元值与围绕它划分形成的两个部分分隔开了,而Hoare-Partition划分则总是将主元值放入两个划分A[p..j]和A[j+1..r]的某一个中。算导给出的Hoare-Partition划分伪代码如下:
Hoare-Partition(A,p,r):x = A[p]i = p-1j = r+1while true do repeat j = j-1 until A[j] <= x do repeat i = i+1 until A[i] >= x if x<j then exchange A[i],A[j] else return j
为了便于比较,用C++语言同时实现了经典Partiion和Hoare-Partition的代码如下:
#include<iostream>#define MAXN 10int hoare_partition(int arr[],int p,int q){ int i,j,x,t; x=arr[p]; i=p; j=q; while(1){for(;i<q && arr[i] < x;i++);for(;j>p && arr[j]>=x;j--); if(i<j){ t = arr[i]; arr[i] = arr[j]; arr[j] = t; }else{ return j;} }}void hoare_qsort(int arr[],int p,int q){ if(p>=q) return; int pivot = hoare_partition(arr,p,q);hoare_qsort(arr,p,pivot); hoare_qsort(arr,pivot+1,q);}int partition(int arr[],int p,int q){ int i,j,x,t; x = arr[q]; i = p-1; for(j=p;j<=q;j++){ if(arr[j]<x){ t = arr[++i]; arr[i] = arr[j]; arr[j] = t; } } t = arr[i+1]; arr[i+1] = arr[q]; arr[q] = t; return i+1;}void quick_sort(int arr[],int p, int q){ if(p>=q) return; int pivot = partition(arr,p,q); quick_sort(arr,p,pivot-1); quick_sort(arr,pivot,q);}int main(){ int arr[MAXN] = {6,9,11,5,1,2,4,10,8,3}; printf("Classical quick sort:"); quick_sort(arr,0,MAXN-1); for(int i=0;i<MAXN;i++) printf("%d ",arr[i]); printf("\nEarliest quick sort:"); hoare_qsort(arr,0,MAXN-1); for(int i=0;i<MAXN;i++) printf("%d ",arr[i]);}
- 快速排序的Hoare划分
- 快速排序的最早划分方法:Hoare划分
- 快速排序(Hoare)
- 快速排序(C.A.R.Hoare版)
- 快速排序(C.A.R.Hoare版)
- 第七章快速排序之“快速排序Hoare版本HOARE-QUICKSORT”(思考题7-1)
- 双向划分的快速排序
- 快速排序的三者取中划分
- W. :Hoare快速排序(利用分治法). 7-1,P94
- 快速排序的划分子序列思想:
- 快速排序的思想进行划分搜索。
- 划分算法(快速排序的根基)
- java双向划分的快速排序
- 快速排序-两种常见的划分
- 快速排序的划分及其扩展
- 快速排序的三路划分法
- 排序算法之三路划分的快速排序
- 第k大的数(快速排序的划分过程)
- 计算方法:高斯-若当主元消去法解线性方程组
- 计算方法:矩阵三角分解法解线性方程组
- 南阳理工:素数距离问题
- 南阳理工:字符串替换
- 南阳理工:又见Fibonacci数列
- 快速排序的Hoare划分
- 南阳理工:背包问题
- 南阳理工:背包问题
- 南阳理工:A+B Problem II
- 大数乘法问题
- 南阳理工:三点顺序
- 南阳理工:三角形面积
- Servlet从入门到精通九——Request
- 南阳理工:独木舟上的旅行