一、冒泡排序
// 冒泡排序
void BubbleSort(vector<int> v) {
int n = v.size();
// i代表第几轮,总共有n-1轮排序
// j是索引,用来对数组v进行操作
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (v[j] > v[j + 1]) {
swap(v[j], v[j + 1]);
}
}
}
}
二、插入排序
数组分为两部分,有序和无序
将无序数组的元素插入有序数组 [参考1]
// 插入排序
void InsertSort(vector<int> v) {
int n = v.size();
//i是无序数组头部,j是遍历整个有序数组的下标
for (int i = 1; i < n; i++) {
for (int j = i - 1; j >= 0 && v[j] > v[j+1]; j--) {
swap(v[j], v[j + 1]);
}
}
}
三、选择排序
每次选择 最小的数放在数组首部,有n个数则选择n次 [参考1]
// 选择排序
void SelectSort(vector<int> v) {
int n = v.size();
for (int i = 0; i < n; i++) {
int min_ = i;
for (int j = i + 1; j < n; j++) {
min_ = v[min_] >= v[j] ? j : min_;
}
if(i != min_)
swap(v[i], v[min_]);
}
}
四、快排
pivot是分界点
在pivot以前的数都比v[pivot]小,在pivot以后的数都比v[pivot]大 [参考2] [参考3]
//快排
void QuickSort(vector<int>& v, int start, int end) {
if (start >= end) return;
int pivot = start;
int i = start;
int j = end;
while (i < j) {
//j向左移,找到第一个比基准v[pivot]小的
while (v[j] >= v[pivot] && i < j) j--;
//i向右移,找到第一个比基准值v[pivot]大的
while (v[i] <= v[pivot] && i < j) i++;
//左右指针相遇前交换
if(i < j)
swap(v[i], v[j]);
}
swap(v[pivot], v[i]);
QuickSort(v, start, i - 1);
QuickSort(v, i + 1, end);
}
五、完整代码
#include<iostream>
#include<vector>
using namespace std;
void Print(vector<int> v) {
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
}
// 冒泡排序
void BubbleSort(vector<int> v) {
int n = v.size();
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (v[j] > v[j + 1]) {
swap(v[j], v[j + 1]);
}
}
}
Print(v);
}
// 插入排序
void InsertSort(vector<int> v) {
int n = v.size();
for (int i = 1; i < n; i++) {
for (int j = i - 1; j >= 0 && v[j] > v[j + 1]; j--) {
swap(v[j], v[j + 1]);
}
}
Print(v);
}
// 选择排序
void SelectSort(vector<int> v) {
int n = v.size();
for (int i = 0; i < n; i++) {
int min_ = i;
for (int j = i + 1; j < n; j++) {
min_ = v[min_] >= v[j] ? j : min_;
}
if (i != min_)
swap(v[i], v[min_]);
}
Print(v);
}
//快排
void QuickSort(vector<int>& v, int start, int end) {
if (start >= end) return;
int pivot = start;
int i = start;
int j = end;
while (i < j) {
while (v[j] >= v[pivot] && i < j) j--;
while (v[i] <= v[pivot] && i < j) i++;
if(i < j)
swap(v[i], v[j]);
}
swap(v[pivot], v[i]);
QuickSort(v, start, i - 1);
QuickSort(v, i + 1, end);
}
int main() {
vector<int> v = { 2,9,-9,7,-6,8,0 };
BubbleSort(v);
InsertSort(v);
SelectSort(v);
QuickSort(v, 0, v.size()-1);
Print(v);
return 0;
};
参考:
1、https://mp.weixin.qq.com/s/YQN-DE5aVRO1m1PDXlVAPg