算法导论--第七章、快速排序

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 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。