目录
1.三种常见的简单排序:
1.1冒泡排序
1.2 选择排序
1.3 插⼊排序
2 常见高级排序算法
2.1 希尔排序
2.2 快速排序
2.3 归并排序
2.4计数排序
先上结论:
#include
#include
#include
using namespace std;
void bubbleSort(vector &v)
{
for (int i = 0; i < v.size() - 1; i++)
{
for (int j = 0; j < v.size() - i - 1; j++)
{
if (v[j] > v[j + 1])
{
swap(v[j], v[j + 1]);
}
}
}
}
int main()
{
vector v = {10, 8, 2, 3, 1, 6, 7, 5, 4, 9};
bubbleSort(v);
for (auto i : v)
{
cout << i << endl;
}
system("pause");
return 0;
}
void selectionSort(vector &arr)
{
int n = arr.size();
int min_index; //最小值对应的index;
for (int i = 0; i < arr.size(); i++)
{
min_index = i; //默认最小值对应的起始索引是当前位置
for (int j = i; j < arr.size(); j++)
{
if (arr[j] < arr[min_index])
{
min_index = j;
}
}
swap(arr[i], arr[min_index]);
}
}
// 插入排序函数
void insertionSort(vector &arr)
{
int n = arr.size();
for (int i = 1; i < n; ++i)
{
int key = arr[i];
int j = i - 1;
// 将大于key的元素向后移动
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j = j - 1;
}
// 插入key到正确的位置
arr[j + 1] = key;
}
}
void shellSort(vector &arr)
{
int n = arr.size();
// 使用一组增量进行排序
for (int gap = n / 2; gap > 0; gap /= 2)
{
// 对每个增量进行插入排序
for (int i = gap; i < n; i++)
{
int temp = arr[i];
int j;
// 将元素插入到正确的位置
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
{
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
// 根据基准元素将数组分成两部分,并返回基准元素的索引
int partition(vector &arr, int low, int high)
{
int pivot = arr[high]; //选择最后一个作为基准
// 初始化较小元素的索引
//递归里面的low 不一定是0开始的所以,写成0 一定报错
int index = low;
for (int j = low; j <= high - 1; j++)
{
if (arr[j] <= pivot)
{
swap(arr[j], arr[index]);
index++;
}
}
// 最后交换arr[i+1]和arr[high],将基准元素放在正确的位置
swap(arr[index], arr[high]);
return index;
}
void quickSort(vector &arr, int low, int high)
{
if (low < high) //[0,0 ]就不在判断了。
{
// 获取基准元素的索引
int pivotIndex = partition(arr, low, high);
// 对基准元素的左边和右边子数组进行递归排序
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
#include
#include
// 合并两个已排序的子数组
void merge(std::vector& arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
// 创建临时数组来存储两个子数组
std::vector leftArr(n1);
std::vector rightArr(n2);
// 将数据复制到临时数组中
for (int i = 0; i < n1; i++) {
leftArr[i] = arr[left + i];
}
for (int i = 0; i < n2; i++) {
rightArr[i] = arr[mid + 1 + i];
}
// 合并两个子数组
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
// 处理剩余的元素(如果有)
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
// 归并排序函数
void mergeSort(std::vector& arr, int left, int right) {
if (left < right) {
// 找到数组中间点
int mid = left + (right - left) / 2;
// 递归排序左半部分和右半部分
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
// 合并已排序的两个子数组
merge(arr, left, mid, right);
}
}
int main() {
std::vector arr = {12, 11, 13, 5, 6, 7};
std::cout << "原始数组: ";
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
// 调用归并排序函数
mergeSort(arr, 0, arr.size() - 1);
std::cout << "排序后数组: ";
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
实现:
#include
#include
void countingSort(std::vector& arr) {
int max_val = *std::max_element(arr.begin(), arr.end()); // 找到数组中的最大值
int min_val = *std::min_element(arr.begin(), arr.end()); // 找到数组中的最小值
int range = max_val - min_val + 1; // 计算数值范围
// 创建计数数组并初始化为0
std::vector count(range, 0);
// 计算每个元素的出现次数
for (int num : arr) {
count[num - min_val]++;
}
// 根据计数数组,重建原始数组
int index = 0;
for (int i = 0; i < range; i++) {
while (count[i] > 0) {
arr[index] = i + min_val;
index++;
count[i]--;
}
}
}
int main() {
std::vector arr = {4, 2, 2, 8, 3, 3, 1};
std::cout << "原始数组: ";
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
// 调用计数排序函数
countingSort(arr);
std::cout << "排序后数组: ";
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}