【交换排序】冒泡排序、快速排序

娇换排序每一趟都可以确定一个元素的最终位置

冒泡排序

冒泡排序就是两两交换,每一轮比较都会确定一个元素的最终位置。

冒泡排序的平均时间复杂度为\(O(n^2)\),其最好情况为\(O(n)\),最坏情况为\(O(n^2)\)

另外注意:在交换排序中,元素的移动次数和比较次数的关系是,两个元素比较一次,若发生交换,那么交换他们两个需要移动三次,因为需要引入一个中间量。

所以,最坏情况下的比较次数为\(\displaystyle\frac{n(1+n)}{2}\),而移动次数为\(\displaystyle\frac{3n(1+n)}{2}\)

点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void BubbleSort(vector<int> &grid) {
    int size = grid.size() - 1;
    for (int i = 0; i < size - 1; i++) {
        bool flag = false;
        for (int j = size - 1; j > i; j--) {
            if (grid[j - 1] > grid[j]) {
                swap(grid[j - 1], grid[j]);
                flag = true;
            }
        }
        if (flag == false) return;
    }
}

int main () {
    int m, n;
    cin >> m;
    vector<int> a(m + 1);
    for (int i = 0; i < m; i++) {
        cin >> n;
        a[i] = n;
    }


    BubbleSort(a);
    for (int i = 0; i < m; i++) {
        cout << a[i] << endl;
    }
    
}

快速排序

  • 首先第一点:在partation部分中的while (low < high)部分,能不能加上等于号。答案是不能。因为之所有要限制low < high就是要让循环在跳出的时候能够满足low == high。如果加上等于号,那么后面high就要比low小1,这就不对了

  • 第二点,在QuickSort中,刚开始就有一个if (low < high)。这里的判断能不能加上等于号,这里的判断是用在。比如[1,5,4,3,2]这样一个数组,那么刚开始第一轮确定的枢轴是1,则会low=high=1,那么接下来在QuickSort第一个部分的时候,由于low==high会直接跳出,不会进入partation以及后面的QuickSort。这样递归才能有个出口,否则无限循环了。

下午出错的地方有两个,找Bug找了半天,两个错都是在partation中,第一个是刚开始的int pivot = grid[low]被我写成了int pivot = grid[0]。另一个错是在中间的两个while循环中,我错写成了while (low < high && grid[high] >= grid[low]),这样每次对比的元素就是动态变化的了,我说怎么很奇怪。正确的是while (low < high && grid[high] >= pivot)

注意:快排的运行时间和每次划分的区间对称性有关。最坏情况就是左右两边一边是0,一边是n-1。而最好的情况就是左右两边对称,这样的运行时间最短。

同时,注意快排的时间效率高不代表移动次数就少,二者之间没有严格的相关关系。

点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int partation(vector<int> &grid, int low, int high) {
    int pivot = grid[low];
    while (low < high) {
        // 将小的往前移
        while (low < high && grid[high] >= pivot) high--;
        grid[low] = grid[high];
		// 大的往后移
        while (low < high && grid[low] <= pivot) low++;
        grid[high] = grid[low];
    }
    grid[low] = pivot;
    return low;
}

void QuickSort(vector<int> &grid, int low, int high) {
    if (low < high) {
        int pivotpos = partation(grid, low, high);
        QuickSort(grid, low, pivotpos - 1);
        QuickSort(grid, pivotpos + 1, high);
    }
}

int main () {
    int m, n;
    cin >> m;
    vector<int> a(m + 1);
    for (int i = 0; i < m; i++) {
        cin >> n;
        a[i] = n;
    }

    QuickSort(a, 0, m - 1);
    for (int i = 0; i < m; i++) {
        cout << a[i] << endl;
    }
    
}
posted on 2025-06-30 16:46  bnbncch  阅读(17)  评论(0)    收藏  举报