算法导论--第七章、快速排序
1. 快速排序描述:
基于分治模式,分为分解、解决和合并三部分;
1)分解:
将数组A[p..r]划分为两个子数组A[p..q-1]和A[q+1..r],是的A[p..q-1]中每个元素都小于或等于A(q)
2)解决:
通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]排序
3)合并:
合并两个有序的数组,A[p..r]
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MaxSize 8 5 6 int Partition(int A[], int p, int r){ 7 int x = A[r];//将A[]中最后一个元素作为主元,基准 8 int i = p - 1; 9 int j; 10 int tmp; 11 12 //通过for(){...}划分数组,因为最后一个元素是主元,所以j < (r - 1 ) 13 for(j = p; j < r; j++){ 14 if(A[j] <= x){//元素比主元小,放到前面,并将两个元素交换位置,i <= j 15 i = i + 1; 16 17 tmp = A[i]; 18 A[i] = A[j]; 19 A[j] = tmp; 20 // printf("\nSwaped: A[%d]: %d, A[%d]: %d\n", i, j, A[i], A[j]); 21 } 22 } 23 //将主元置于小于和大于两部分之间 24 tmp = A[i + 1]; 25 A[i + 1] = A[r]; 26 A[r] = tmp; 27 28 return (i + 1); 29 } 30 31 void QuickSort(int A[], int p, int r){ 32 if(p < r){ 33 int q; 34 35 q = Partition(A, p, r); 36 QuickSort(A, p, q - 1); 37 QuickSort(A, q + 1, r); 38 } 39 } 40 41 int main(){ 42 int A[MaxSize] = {2, 1, 1, 1, 3, 5, 6, 4}; 43 int i; 44 45 printf("A[]...\n"); 46 for(i = 0; i < MaxSize; i++){ 47 printf("%d ", A[i]); 48 } 49 50 QuickSort(A, 0, (MaxSize - 1)); 51 52 printf("\nsorted A[]...\n"); 53 for(i = 0; i < MaxSize; i++){ 54 printf("%d ", A[i]); 55 } 56 printf("\n"); 57 58 system("pause"); 59 return 0; 60 }