快速排序与其中的划分算法

来源:互联网 发布:西门子plc编程教学 编辑:程序博客网 时间:2024/06/05 16:42

快速排序的原理:

QUICKSORT(A,p,r)if p<rthen q <- PARTITION(A,p,r)     QUICKSORT(A,p,q-1)     QUICKSORT(A,q+1,r)

算法导论第7章快速排序给出的切分算法:

PARTITION(A,p,r)x <- A[r]i <- p-1for j <- p to r-1if A[j] <- xthen i <- i+1 exchange A[i]<->A[j]exchange A[i+1]<->A[r]return i+1;
最初由C.A.R.Hoare设计的切分算法(划分算法):

HOARE-PARTITION(A,p,r)x <- A[p]i <- p-1j <- r+1while TRUEdo repeat j <- j-1until A[j] <= x   repeat i <- i+1until A[i] >= xif i < jthen exchange A[i] <-> A[j]else return j;
两种切分算法的实现:

void swap(int *a,int *b){inttemp = *a;*a = *b;*b = temp;}int hoare_partition(int a[],int left,int right){int i,j,pivot;pivot = a[left];i = left - 1;j = right + 1;while(1){do{j--;}while(a[j]>pivot);do{i++;}while(a[i]<pivot);if(i<j)swap(a+i,a+j);elsereturn j;}}int partition(int a[],int left,int right){int i,j;int pivot = a[right];i = left - 1;for(j=left;j<right;j++){if(a[j]<=pivot){i++;swap(a+i,a+j);}}swap(a+i+1,a+right);return i+1;}

Hoare切分的变形版本:

int Partition(int arr[], int low, int high){int i, j, pivot;i = low, j = high, pivot = arr[low];while(i < j){while(i < j && arr[j] >= pivot) --j;if(i < j) swap(arr[i++], arr[j]);while(i < j && arr[i] <= pivot) ++i;if(i < j) swap(arr[i], arr[j--]);}return j; //返回基准元素位置}


得到的快速排序算法为

void qSort(int a[],int left,int right){if(left<right){int idx = partition(a,left,right);qSort(a,left,idx-1);qSort(a,idx+1,right);}}




0 0
原创粉丝点击