本文使用C++实现了各种常见的排序算法,供读者参考。
排序算法一览:
1、直接插入排序
2、希尔排序
3、冒泡排序
4、快速排序
5、直接选择排序
6、归并排序
以下是代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 1、直接插入排序:从无序区间选择一个值,放到有序区间的合适位置
void insertSort(vector<int>& arr) {
int i, j, temp, len = arr.size();
for (i = 1; i < len; ++i) {
temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; --j) {
arr[j + 1] = arr[j]; // 向后移动
}
arr[j + 1] = temp;
}
}
// 2、希尔排序:增量 + 插入
void shellSort(vector<int>& arr) {
int h, i, j, temp, len = arr.size();
for (h = len / 2; h > 0; h /= 2) {
for (i = h; i < len; ++i) {
temp = arr[i];
for (j = i - h; j >= 0 && temp < arr[j]; j -= h) {
arr[j + h] = arr[j];
}
arr[j + h] = temp;
}
}
}
// 3、冒泡排序:遇到小的值就进行交换,直到交换出无序队列的最小值
void bubbleSort(vector<int>& arr) {
int len = arr.size();
for (int i = 0; i < len; ++i) {
bool change = false;
for (int j = len - 2; j >= i; --j) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
change = true;
}
}
if (!change) return;
}
}
// 4、快速排序
void quickSort(vector<int>& arr, int low, int high) {
int i, j, pivot;
if (low < high) {
i = low;
j = high;
pivot = arr[low];
while (i < j) {
// 分解:以pivot为中点,将区间分为大于pivot的和小于pivot的
while (i < j && arr[j] >= pivot) --j;
if (i < j) arr[i++] = arr[j];
while (i < j && arr[i] <= pivot) ++i;
if (i < j) arr[j--] = arr[i];
}
arr[i] = pivot;
quickSort(arr, low, i - 1); // 递归左子区间
quickSort(arr, i + 1, high); // 递归右子区间
}
}
// 5、直接选择排序
void selectSort(vector<int>& arr) {
int pos, len = arr.size();
for (int i = 0; i < len; ++i) {
pos = i;
for (int j = i + 1; j < len; ++j) {
// 选择无序区中的最小值
if (arr[j] < arr[pos]) {
pos = j;
}
}
swap(arr[pos], arr[i]);
}
}
// 6、堆排序
// 7、归并排序
// 对有序区间的合并
void merge(vector<int>& arr, int left, int mid, int right) {
vector<int> tmp(right + 1, 0);
int i = left, j = mid + 1, pos = left;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
tmp[pos++] = arr[i++];
} else {
tmp[pos++] = arr[j++];
}
}
while (i <= mid) tmp[pos++] = arr[i++];
while (j <= right) tmp[pos++] = arr[j++];
for (int i = left; i <= right; ++i) {
arr[i] = tmp[i];
}
}
// 归并排序:不断分解子数组,然后合并
void mergeSort(vector<int>& arr, int left, int right) {
if (left >= right) return;
int mid = left + ((right - left) >> 2);
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
int main() {
// 1、直接插入排序
vector<int> arr{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
insertSort(arr);
cout << "insertSort: ";
for (auto& iter : arr) {
cout << iter << " "; }
cout << endl;
// 2、希尔排序
vector<int> arr2{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
shellSort(arr2);
cout << "shellSort: ";
for (auto& iter : arr2) {
cout << iter << " "; }
cout << endl;
// 3、冒泡排序
vector<int> arr3{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
bubbleSort(arr3);
cout << "bubbleSort: ";
for (auto& iter : arr3) {
cout << iter << " "; }
cout << endl;
// 4、快速排序
vector<int> arr4{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
quickSort(arr4, 0, arr4.size() - 1);
cout << "quickSort: ";
for (auto& iter : arr4) {
cout << iter << " "; }
cout << endl;
// 5、直接选择排序
vector<int> arr5{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
selectSort(arr5);
cout << "selectSort: ";
for (auto& iter : arr5) {
cout << iter << " "; }
cout << endl;
// 6、归并排序
vector<int> arr7{
4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
mergeSort(arr7, 0, arr7.size() - 1);
cout << "mergeSort: ";
for (auto& iter : arr7) {
cout << iter << " "; }
cout << endl;
return 0;
}
以下是程序输出:
insertSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
shellSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
bubbleSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
quickSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
selectSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
mergeSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
谢谢阅读