概述
在《算法导论》中有介绍到快排的原始划分方法——Hoare划分,在算导7.1节中给出的快排经典算法中,将主元值与围绕它划分形成的两个部分分隔开了,而Hoare-Partition划分则总是将主元值放入两个划分A[p..j]和A[j+1..r]的某一个中。算导给出的Hoare-Partition划分伪代码如下:
Hoare-Partition(A,p,r):
x = A[p]
i = p-1
j = r+1
while 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 10
int 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划分所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复