交换排序的基本思想是:两两比较待排列的元素,返现倒序即交换。基于这种思想的有两种排序方法,即冒泡排序和快速排序。
1. 冒泡排序和快速排序的基本原理
参考文章:
2. 参考代码
#include <iostream>
#include <vector>
void Swap(std::vector<int>& unorder_array, int a, int b) { // 交换数据,不使用中间变量
unorder_array[a] = unorder_array[a] + unorder_array[b]; // 注意这里是unorder_array[b]而不是b
unorder_array[b] = unorder_array[a] - unorder_array[b];
unorder_array[a] = unorder_array[a] - unorder_array[b];
}
// 冒泡排序
void BubbleSort(std::vector<int>& unorder_array) {
for (int i = 1; i < unorder_array.size(); ++i) { // i代表的是当前的第i轮
for (int j = unorder_array.size() - 1; j >= i; --j) {
if (unorder_array[j] < unorder_array[j - 1]) {
Swap(unorder_array, j , j - 1);
}
}
}
}
// 快速排序的子程序
int QuickSortPartition(std::vector<int>& unorder_array, int left, int right) {
int i = left; // 快速排序这里使用"双指针"
int j = right;
int temp = unorder_array[left]; // 假设我们选择的是第一个数据
while (i < j) {
while (i < j && unorder_array[j] > temp) { // 首先我们先从右侧循环找到比temp小的数据
--j;
}
if (i < j) { // 表示我们找到了
unorder_array[i] = unorder_array[j]; // 进行填坑
++i; // 左边的指针向右移动
}
while(i < j && unorder_array[i] < temp) {
++i;
}
if (i < j) {
unorder_array[j] = unorder_array[i];
--j;
}
}
unorder_array[i] = temp; // temp现在位于中间,左边都小于temp,右边大于temp
return i;
}
// 快速排序算法
void QuickSort(std::vector<int>& unorder_array, int left, int right) {
if (left < right) {
int middle = QuickSortPartition(unorder_array, left, right); // 得到中间位置
QuickSort(unorder_array, left, middle - 1);
QuickSort(unorder_array, middle + 1, right); // 递归分之
}
}
int main()
{
std::vector<int> unorder_array;
int data;
std::cin >> data;
unorder_array.push_back(data);
while (std::cin.get() != '\n') {
std::cin >> data;
unorder_array.push_back(data);
}
std::cout << "orgin seq is: ";
for (auto it = unorder_array.begin(); it != unorder_array.end(); ++it) {
std::cout << *it << " ";
}
std::cout << "\n";
QuickSort(unorder_array, 0, unorder_array.size() - 1);
std::cout << "quick sort is: ";
//BubbleSort(unorder_array);
//std::cout << "bubble sort is: ";
for (int i = 0; i < unorder_array.size(); ++i) {
std::cout << unorder_array[i] << " ";
}
return 0;
}
下面是选择排序~