数据结构(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].