C++基础算法排序篇

📟作者主页:慢热的陕西人

🌴专栏链接:C++算法

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

主要讲解C++算法中所涉及到的两个排序算法,快排和归并。

文章目录

    • Ⅰ.排序
      • [Ⅰ. Ⅰ 快排](#Ⅰ. Ⅰ 快排)
      • [Ⅰ. Ⅱ 归并](#Ⅰ. Ⅱ 归并)

Ⅰ.排序

Ⅰ. Ⅰ 快排

思路:

​ 平均时间复杂度:nlogn;

​ ①确定分界点:即选择一个标准值keykey的选取方法有q[l]q[(l + r) / 2], q[r],随机;

​ ②调整位置:将数组分为两个区间,前半部分区间都是q[i] <= key, 后半部分区间都是 q[i] >= key

​ ③递归处理左右两端的区间;

模板:

cpp 复制代码
#include<iostream>

using namespace std;
const int N = 1e6 + 10;

int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int x = q[l], i = l - 1, j = r + 1;
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[i] > x);
        if(i < j) swap(q[i], q[j]);
    }
   	quick_sort(q,l,j);
    	quick_sort(q,j + 1, r);
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%d", &q[i]);
	
    quick_sort(q,l,r);
    
    for(int i = 0; i < nl ++i) printf("%d ",q[i]);
    
    return 0;
}

注意:

​ 对于边界问题:

​ 当我们选择key为q[l]的时候,那么递归的时候边界就只能是:

CPP 复制代码
    quick_sort(q,l,j);
    quick_sort(q,j + 1, r);

如果边界是如下所示的情况,就容易造成死递归,举例数组为1 2的情况:

这时候key就是1,那么如下条件就会变成左区间[0, -1], 右区间[0, 1]就会死递归了。

所以为了避免这种情况,当选取keyq[l]的时候选用上面的区间即可,当选取keyq[r]的时候我们选用下面的区间即可。

CPP 复制代码
    quick_sort(q,l,i - 1);
    quick_sort(q,i, r);

Ⅰ. Ⅱ 归并

思路:

​ 时间复杂度:nlogn;

​ ①确定分界点mid = (l + r) / 2;

​ ②不断的将数组进行分解,直到分解为一个一个为一组为止。

​ ③将这些分解完的**++有序++ **数组一个一个进行++有序++合并。

模板:

cpp 复制代码
#include<iostream>

using namespace std;

const int N = 1000010;

int n;
int q[N], tmp[N];

void merge_sort(int q[], int l, int r)
{
 if (l >= r) return;
    
 int mid = (l + r) >> 1;
    //归类
 merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
    //合并
 int k = 0, i = l, j = mid + 1;
 while (i <= mid && j <= r)
     if (q[i] <= q[j]) tmp[k++] = q[i++];
     else tmp[k++] = q[j++];
 while (j <= r) tmp[k++] = q[j++];
 while (i <= mid) tmp[k++] = q[i++];
    
 for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}  
int main()
{
	int n;
 scanf("%d", &n);
 for(int i = 0; i < n; i++) scanf("%d", &q[i]);

 merge_sort(q, 0, n);

 for(int i = 0; i < n; i++) printf("%d ", q[i]);
	return 0;
}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

相关推荐
yzx99101328 分钟前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn
亮亮爱刷题32 分钟前
算法练习-回溯
算法
眼镜哥(with glasses)1 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
zh_xuan4 小时前
c++ 单例模式
开发语言·c++·单例模式
int型码农6 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
利刃大大6 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
UFIT6 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面6 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked936 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,6 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法