【交换排序】冒泡排序、快速排序
娇换排序每一趟都可以确定一个元素的最终位置
冒泡排序
冒泡排序就是两两交换,每一轮比较都会确定一个元素的最终位置。
冒泡排序的平均时间复杂度为\(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;
}
}
浙公网安备 33010602011771号