思想:
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(" Result: "); print(a); return 0; } void quickSort(int a[],int begin,int end){ int partition = getPartition(a,begin,end); print(a); printf("基准位置:%d ",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(" "); for(k=0;k<10;k++){ printf("%d ",p[k]); } }