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

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

相关推荐
螺旋天光极锐斩空闪壹式!4 分钟前
自制游戏:监狱逃亡
c++·游戏
Hera_Yc.H33 分钟前
数据结构之一:复杂度
数据结构
工业3D_大熊1 小时前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
暮色_年华1 小时前
Modern Effective C++ Item 11:优先考虑使用deleted函数而非使用未定义的私有声明
c++
流星白龙1 小时前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
Smile丶凉轩2 小时前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
肥猪猪爸2 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
linux_carlos2 小时前
环形缓冲区
数据结构
readmancynn2 小时前
二分基本实现
数据结构·算法
萝卜兽编程2 小时前
优先级队列
c++·算法