划分与快排

今天着急上课,计算机网络的课,所以先贴代码。

 1 #include <stdio.h>
 2 #include <limits.h>
 3 
 4 int partition(int low, int high);
 5 void QuickSort(int p, int q);
 6 void swap(int *p1, int *p2);
 7 
 8 int iArray[10] = {65, 70, 75, 80, 85, 60, 55, 50, 45, INT_MAX};
 9 
10 int main(int argc, char *argv[])
11 {
12     QuickSort(0, 8);
13     for(int i = 0; i < 9; i++)
14     {
15         printf("%d ", iArray[i]);
16     }
17 
18     printf("\n");
19     
20     return 0;
21 }
22 
23 //快排函数,参数就是数组的上下界,它是外层函数调用的,外层函数不管你里面怎么实现,更不用知道要不要扩展空间
24 //调用QuickSort函数时参数就是数组的上下界。
25 void QuickSort(int p, int q)
26 {
27     int j;
28     
29     if(p < q)
30     {
31         //递归出口
32         j = partition(p, q + 1);
33         //递归过程
34         QuickSort(p, j - 1);
35         QuickSort(j + 1, q);
36 
37     }
38 }
39 
40 //划分函数,为了防止60 45 50 55这种情况,要在最后面加上一个大的数(正无穷或者是上次划分的pivot)
41 //所以在调用partition函数时,参数的上界要+1
42 int partition(int low, int high)
43 {
44     int i = low;
45     int p = high;
46     int v;//暂存pivot的值
47     v = iArray[low];
48 
49     while(i < p)
50     {
51         //从左向右找第一个比pivot大的值的下标
52         i++;
53         while(iArray[i] < v)
54         {
55             i++;
56         }
57 
58         //从右向左找第一个比pivot小的值的下标
59         p--;
60         while(iArray[p] > v)
61         {
62             p--;
63         }
64 
65         if(i < p)
66         {
67             swap(&iArray[i], &iArray[p]);
68         }
69 
70     }//while
71 
72     //让pivot元素回到正确的位置
73     iArray[low] = iArray[p];
74     iArray[p] = v;
75     
76     /*
77     //显示每趟的排序结果
78     for(int k = 0; k < 9; k++)
79     {
80         printf("%d ", iArray[k]);
81     }
82 
83     printf("\n");
84     */
85 
86     return p;
87 }
88 
89 //交换两个数据
90 void swap(int *p1, int *p2)
91 {
92     int temp;
93     temp = *p1;
94     *p1 = *p2;
95     *p2 = temp;
96 }

 

你可能感兴趣的:(划分与快排)