没志青年
发布于 2025-11-13 / 21 阅读
0

常用排序算法

冒泡排序

每次选出一个最大的。

数组n个元素,需要进行n-1次

交换的时候需要注意大小顺序

void bubble_sort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {   // 注意这里是n-1-i,每次排序完,它都需要缩小范围
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

快速排序

算法思想:

根据基准将数组分为两个部分,左边的是小于基准的,右边的是大于基准的。然后对于两个部分的每一部分继续快速排序,就是递归。

C语言实现思路:

排序完成的表现:左右两个指针指向同一个位置。

选择基准:通常为每个部分的第一个元素

交换后,对应的指针要+1

/**
 * 待排序的数组
 * 左指针
 * 右指针
 */
void quick_sort(int *num, int start_num, int end_num) {
  if (start_num < end_num) { // 退出递归的条件,千万不能忘记
    int i = start_num;
    int j = end_num;
    int temp = num[start_num]; // 以第一个元素为基准

    while (i < j) { // 【i==j时为基准元素的位置】
      // 从右边向左边扫描,直到比基准小,或者左右指针相遇
      while (i < j && num[j] > temp)
        j--;
      if (i < j) // 左右指针相遇的话,这个就不成立
      {
        num[i] = num[j]; // 右边的元素插在空位上
        i++;             // 更新左指针
      }

      // 从左边向右边扫描,直到比基准大,或者左右指针相遇
      while (i < j && num[i] <= temp)
        i++;
      if (i < j) {
        num[j] = num[i];
        j--; // 更新右指针
      }
    }
    num[i] = temp; // 此时i为基准元素的位置,基准元素归位

    // 基准元素不动,所以需要-1和+1
    quick_sort(num, start_num, i - 1); // 递归左边部分
    quick_sort(num, i + 1, end_num);   // 递归右边部分
  }
}

选择排序