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为ql的时候,那么递归的时候边界就只能是:

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;
}

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

相关推荐
不相心 -w-几秒前
Cmake的基础用法
linux·开发语言·c++
白白白小纯3 分钟前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
撑伞的鱼993714 分钟前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
手写码匠26 分钟前
华为云Flexus+DeepSeek征文|Dify 构建企业级联网搜索 Agent:查询改写、多源检索与引用溯源实战
人工智能·深度学习·算法·aigc
七夜zippoe30 分钟前
DolphinDB 能耗统计分析实战:报表生成、同比环比与定额对比
人工智能·算法·dolphindb·报表生成·能耗统计·定额对比
为啥全要学40 分钟前
在大语言模型上使用 PPO 算法
人工智能·算法·语言模型
j7~1 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
王老师青少年编程1 小时前
2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷3:文末附答案
c++·答案·模拟题·2026年·青少年信息素养大赛·算法应用主题赛·决赛
zander2581 小时前
35. 搜索插入位置:从边界语义理解二分查找
数据结构·算法·leetcode
程序喵大人1 小时前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl