• 快速排序
    • 基本思想
    • 步骤
    • By C++
    • By Golang
    • 排序过程

    快速排序

    基本思想

    • 分治:在未排序序列中选择一个基准数(一般为第一个),将小于基准数的放在其左边,大于基准数的放在其右边,即分成两个区间
    • 递归:将上述两个区间,每个区间内执行上述操作,以此类推,直到排序完成

    步骤

    • 选择一个基准数,一般为第一个: pivot := list[left]
    • 将小于基准数的放在其左边
    • 将大于基准数的放在其右边
    • 对每个分区执行递归操作:quickSort(list, left, i-1);quickSort(list, i+1, right)

    By C++

    1. #include <stdio.h>
    2. #define MaxSize 100
    3. typedef int KeyType; /*关键字类型*/
    4. typedef char ElemType[10]; /*其他数据项类型*/
    5. typedef struct
    6. {
    7. KeyType key; /*关键字域*/
    8. ElemType data; /*其他数据域*/
    9. } LineList; /*线性表元素类型*/
    10. void QuickSort(LineList R[],int s,int t) /*对R[s]至R[t]的元素进行快速排序*/
    11. {
    12. int i=s,j=t;
    13. LineList tmp;
    14. if (s<t) /*区间内至少存在一个元素的情况*/
    15. { tmp=R[s]; /*用区间的第1个记录作为基准*/
    16. while (i!=j) /*从区间两端交替向中间扫描,直至i=j为止*/
    17. { while (j>i && R[j].key>tmp.key)
    18. j--; /*从右向左扫描,找第1个关键字小于tmp.key的R[j]*/
    19. R[i]=R[j]; /*找到这样的R[j],则R[i]和R[j]交换*/
    20. while (i<j && R[i].key<tmp.key)
    21. i++; /*从左向右扫描,找第1个关键字大于tmp.key的R[i]*/
    22. R[j]=R[i]; /*找到这样的R[i],则R[i]和R[j]交换*/
    23. }
    24. R[i]=tmp;
    25. QuickSort(R,s,i-1); /*对左区间递归排序*/
    26. QuickSort(R,i+1,t); /*对右区间递归排序*/
    27. }
    28. }
    29. void main()
    30. {
    31. LineList R[MaxSize];
    32. KeyType a[]={75,87,68,92,88,61,77,96,80,72};
    33. int n=10,i;
    34. for (i=0;i<n;i++)
    35. R[i].key=a[i];
    36. printf("排序前:");
    37. for (i=0;i<n;i++)
    38. printf("%3d",R[i].key);
    39. printf("\n");
    40. QuickSort(R,0,n-1);
    41. printf("排序后:");
    42. for (i=0;i<n;i++)
    43. printf("%3d",R[i].key);
    44. printf("\n");
    45. }

    By Golang

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. func quickSort(list []int, left, right int) []int {
    6. if left < right {
    7. i, j := left, right
    8. pivot := list[left] // 以左边第一个数作为基准数,将第一个数暂存在pivot变量中
    9. // 分治
    10. for i < j {
    11. // 从右向左找出第一个小于基准数的,将list[j]赋值给list[i]
    12. for j > i && list[j] > pivot {
    13. j--
    14. }
    15. list[i] = list[j]
    16. // 从左向右找出第一个大于基准数的,将list[i]赋值给list[j]
    17. for i < j && list[i] < pivot {
    18. i++
    19. }
    20. list[j] = list[i]
    21. }
    22. list[i] = pivot
    23. fmt.Println(list) // 打印该趟的序列
    24. // 递归
    25. quickSort(list, left, i-1)
    26. quickSort(list, i+1, right)
    27. }
    28. return list
    29. }
    30. func main() {
    31. list := []int{75, 87, 68, 92, 88, 61, 77, 96, 80, 72}
    32. fmt.Println("初始序列:", list)
    33. result := quickSort(list, 0, len(list)-1)
    34. fmt.Println("最终结果:", result)
    35. }

    排序过程

    1. 初始序列: [75 87 68 92 88 61 77 96 80 72]
    2. 1 趟:[72 61 68 75 88 92 77 96 80 87]
    3. 2 趟:[68 61 72 75 88 92 77 96 80 87]
    4. 3 趟:[61 68 72 75 88 92 77 96 80 87]
    5. 4 趟:[61 68 72 75 87 80 77 88 96 92]
    6. 5 趟:[61 68 72 75 77 80 87 88 96 92]
    7. 6 趟:[61 68 72 75 77 80 87 88 96 92]
    8. 7 趟:[61 68 72 75 77 80 87 88 92 96]
    9. 最终结果: [61 68 72 75 77 80 87 88 92 96]