• 冒泡排序
    • 基本思想
    • 步骤
    • By C++
    • By Golang
    • 排序过程

    冒泡排序

    基本思想

    • 比较相邻两个元素,如果第一个比第二个大,就交换两者的顺序
    • 对每一对相邻的元素做同样的操作,从最后一对到第一对,每一趟结束最小的元素会排在第一个(即冒泡)
    • 从未排序的元素开始循环做以上操作,直到排序完成

    步骤

    1. 第一层循环: i=0; i<(len-1); i++
    2. 第二层循环: j=len-1; j>i; j—
    3. 比较相邻两个元素: list[j-1]和list[j]
    4. 如果前者比后者大,就交换顺序: list[j-1], list[j] = list[j], list[j-1]

    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 BubbleSort(LineList R[],int n)
    11. {
    12. int i,j,exchange;
    13. LineList tmp;
    14. for (i=0;i<n-1;i++)
    15. { exchange=0;
    16. for (j=n-1;j>i;j--) /*比较,找出最小关键字的记录*/
    17. if (R[j].key<R[j-1].key)
    18. { tmp=R[j]; /*R[j]与R[j-1]进行交换,将最小关键字记录前移*/
    19. R[j]=R[j-1];
    20. R[j-1]=tmp;
    21. exchange=1;
    22. }
    23. if (exchange==0) /*本趟未发生交换时结束算法*/
    24. return;
    25. }
    26. }
    27. void main()
    28. {
    29. LineList R[MaxSize];
    30. KeyType a[]={75,87,68,92,88,61,77,96,80,72};
    31. int n=10,i;
    32. for (i=0;i<n;i++)
    33. R[i].key=a[i];
    34. printf("排序前:");
    35. for (i=0;i<n;i++)
    36. printf("%3d",R[i].key);
    37. printf("\n");
    38. BubbleSort(R,n);
    39. printf("排序后:");
    40. for (i=0;i<n;i++)
    41. printf("%3d",R[i].key);
    42. printf("\n");
    43. }

    By Golang

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. // 冒泡排序,从小到大
    6. func bubbleSort(list []int) []int {
    7. for i := 0; i < len(list)-1; i++ {
    8. for j := len(list) - 1; j > i; j-- { // 从最后两个元素开始比较
    9. if list[j-1] > list[j] { // 相邻元素对比
    10. list[j-1], list[j] = list[j], list[j-1] // 如果后者比前者小,就交互位置
    11. }
    12. }
    13. fmt.Println("第", i+1, "趟:", list)
    14. }
    15. return list
    16. }
    17. func main() {
    18. list := []int{75, 87, 68, 92, 88, 61, 77, 96, 80, 72}
    19. fmt.Println("初始序列:", list)
    20. result := bubbleSort(list)
    21. fmt.Println("最终结果:", result)
    22. }

    排序过程

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