📜  优化的冒泡排序 - C++ (1)

📅  最后修改于: 2023-12-03 15:36:23.546000             🧑  作者: Mango

优化的冒泡排序 - C++

冒泡排序是常见的排序算法之一,但其时间复杂度较高,不适用于大数据量的排序。优化冒泡排序算法可提高其效率,本文介绍了一种常用的优化方法。

什么是冒泡排序?

冒泡排序是一种简单的比较排序算法,其基本思想是将较大的元素逐步“冒泡”到数列的尾部。具体实现过程如下:

  1. 从数列开头开始,依次比较相邻两个元素的大小。
  2. 若前一个元素大于后一个元素,则交换它们的位置。
  3. 这样一遍遍历下来,数列中最大的元素被“冒泡”到了末尾。
  4. 接着用同样的方法将剩余的元素进行排序,直至整个数列有序。

该算法的时间复杂度为O(n^2),因此不适用于大数据量的排序。

优化1:加入标记变量

冒泡排序会反复遍历数列,直到没有可以交换的元素为止。在每一次遍历结束后,若没有进行任何元素的交换,则说明数列已经有序,无需继续后面的遍历。

为了优化冒泡排序的效率,我们可以加入一个标记变量,判断在一次遍历中是否有进行元素的交换。若没有交换,说明数列已经有序,直接结束排序。

以下是优化后的冒泡排序代码:

void bubbleSort(int arr[], int n) {
    bool flag;  // 标记变量,记录一次遍历中是否有进行元素交换
    for (int i = 0; i < n - 1; i++) {
        flag = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                flag = true;
            }
        }
        if (!flag) {
            break;  // 若一次遍历中未发生元素交换,说明数列已有序
        }
    }
}
优化2:记录最后一次交换位置

冒泡排序每次将最大的元素“冒泡”到数列末尾,因此在一次遍历中,最后一次交换的位置后面的元素均已有序,不必再次遍历。我们可以记录最后一次交换的位置,缩小下一次遍历的范围。

以下是加入记录交换位置优化的代码:

void bubbleSort(int arr[], int n) {
    int i = n - 1;  // i记录最后一次交换的位置
    while (i > 0) {
        int pos = 0;  // pos记录最后一次交换的位置
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                pos = j;
            }
        }
        i = pos;  // 修改最后一次遍历的位置
    }
}
总结

优化的冒泡排序算法虽然难以与快速排序、归并排序等高效的排序算法相比,但在某些情况下仍有可靠的应用。程序员在编写冒泡排序算法时,应该采用以上优化方法,提高其效率和性能。