思想:
1、数组A[n]被划分两个字数组A[0..q-1]和A[q+1..n],使得对于数组A[0..q-1]中的元素都小于A[q], A[q+1..n]中的元素都大于等于A[q]。
2、通过递归调用快速排序,对字数组A[0..q-1]和A[q+1..n]进行排序。
因为两个字数组已经是就地排好序的了,整个数组已经排好序了。
#include <stdio.h>
#include <stdlib.h>
void quickSort(int a[],int begin,int end);
int getPartition(int *p,int begin,int end);
void swap(int *p,int a,int b);
void print(int *p);
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int length = 10;
int i;
print(a);
quickSort(a,0,length-1);
printf("\nResult:\n");
print(a);
return 0;
}
void quickSort(int a[],int begin,int end){
int partition = getPartition(a,begin,end);
print(a);
printf("基准位置:%d\t",partition);
if(begin < partition-1){
quickSort(a,begin,partition-1);
}
if(partition+1<end){
quickSort(a,partition+1,end);
}
}
int getPartition(int *p,int begin,int end){
int i,j,pivot;
pivot = begin;
j=begin+1;
for(i=begin+1; i<=end; i++){
if(p[i] < p[pivot]){
swap(p,i,j);
j++;
}
}
--j;
swap(p,pivot,j);
return j;
}
void swap(int *p,int a,int b){
int tmp = p[a];
int i;
p[a]=p[b];
p[b]=tmp;
}
void print(int *p){
int k;
printf("\n");
for(k=0;k<10;k++){
printf("%d ",p[k]);
}
}