数据结构(12) - 快速排序

快速排序(Quicksort),是对冒泡排序算法的一种改进。算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

 1 /**
 2  * C data structure quick sort example.
 3  * 
 4  * License - MIT.
 5 */
 6 
 7 #include <stdio.h>
 8 
 9 
10 #define DISPLAY_ARRAY(i, buf, len) \
11         do { \
12             for (i = 0; i < len; i++) \
13                 printf("%d ", buf[i]); \
14             printf("\n"); \
15         } while(0)
16 
17 
18 /**
19  * quick_pass - Quick pass.
20 */
21 int quick_pass(int *buf, int i, int j)
22 {
23     int tmp = buf[i];
24 
25     while (i < j)
26     {
27         while ((i < j) && (tmp <= buf[j]))
28             j--;
29 
30         if (i < j)
31             buf[i] = buf[j];
32 
33         while ((i < j) && (tmp >= buf[i]))
34             i++;
35 
36         if (i < j)
37             buf[j] = buf[i];
38     }
39     
40     buf[i] = tmp;
41 
42     return i;
43 }
44 
45 
46 /**
47  * quick_sort - Quick sort.
48 */
49 int quick_sort(int *buf, int low, int high)
50 {
51     int mid = 0;
52 
53     if (low < high) {
54         mid = quick_pass(buf, low, high);
55 
56         quick_sort(buf, low, mid - 1);
57         quick_sort(buf, mid + 1, high);
58     }
59 
60     return 0;
61 }
62 
63 
64 /**
65  * Main function.
66 */
67 int main(void)
68 {
69     int i = 0;
70     int buf[] = {79, 28, 23, 0, 46, 89, 65, 21, 97, 5};
71     int len = sizeof(buf) / sizeof(int);
72 
73     printf("The original array:\n");
74     DISPLAY_ARRAY(i, buf, len);
75 
76     quick_sort(buf, 0, len - 1);
77 
78     printf("The sort array:\n");
79     DISPLAY_ARRAY(i, buf, len);
80 
81     return 0;
82 }

 

详情请参考Github: [Link] [https://github.com/Phoebus-Ma/C-Helper/tree/main/Class-1/Sort.C].

posted @ 2022-06-25 17:45  this毛豆  阅读(62)  评论(0编辑  收藏  举报