C++STL函数和排序算法的快排以及归并排序详解

 更新时间:2022年03月02日 15:25:56   作者:披星戴月的贾维斯  
这篇文章主要为大家详细介绍了C++STL函数和排序算法的快排以及归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、队列是什么?

头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。

像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人。

就像管道一样先进先出。

队列的相关概念:

1.队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头。

2.入队:队列的插入操作。

3.出队:队列的删除操作。

队列的声明:                                                                                                                        

#include<iostream>
#include<queue>//队列的头文件
using namespace std;
int main ()
{
    queue<int> a;//队列的声明
    priority_queue<int> q;  //大根堆
    priority_queue<int, vector<int>, greater<int>> q;   // 小根堆
    struct Rec//结构体rec中大根堆要定义小于号,小根堆要定义大于号
    {
        int x,y;
        bool operator >(const Rec &t) const
        {
            return x > t.x;
        }
    };
    queue<Rec> q;
    return 0;
}

(1)循环队列 queue

  • push    // 从队尾插入
  • pop     // 从队头弹出
  • front   // 返回队头元素
  • back    // 返回队尾元素

(2)优先队列 priority_queue

  •  push    // 把元素插入堆
  • pop     // 删除堆顶元素
  • top     // 查询堆顶元素(最大值)
#include<iostream>
#include<queue>//队列的头文件
using namespace std;
int main ()
{
    queue<int> a;//队列的声明
    a.push(1);//在队头插入一个新元素;
    a.pop();//弹出队尾元素
    a.front();//返回队头
    a.back();//返回队尾
    //优先队列中
    a.top();//取最大值
    a.pop();//去最大值
    //注意:队列没有clear 函数
    q = queue<int>();//重新初始化一个队列,起到清除队列的效果。
    return 0;
}

二、排序算法

1.快速排序

主要思想:分治

解题步骤:

1、确定分界点,如果数据量比较大,到一百万之类的,建议分界点取中间。

2、调整区间,分为>=x,和<=x两个部分。

3、递归处理左右两段。

##include<iostream>
using namespace std;
const int N = 1e6 + 10;
int q[N];
int n;
void quick_sort(int q[], int l, int r)
{
    if( l >= r) return;//判断数组是否只有1位数或为空
    int x = q[l + r >> 1], i = l - 1, j = r + 1;//设置分界点以及i,j两个“指针”;
    while( i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j) //特判如果i,j两指针都不满足i<=x,j>=x这个条件时,交换两个值
        {
            int t= q[i];
            q[i] = q[j];
            q[j] =t;
        }
    }
    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, 0, n - 1);
    for(int i = 0; i < n; i++) printf("%d ",q[i]);
    return 0;
}

快速排序例题:第k个数 

#include<iostream>
using namespace std;
int n , k;
const int N = 100010;
int q[N];
int quick_sort(int l, int r,int k)
{
    if(l == r) return q[l];//特判如果只有一个数,返回这个数
    int x = q[l + r >> 1], i = l - 1, j = r + 1;// 
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }
    int sl = j - l + 1;
    if(k <= sl) return quick_sort(l, j , k);//递归左边
    return quick_sort(j + 1, r, k - sl);//递归右边
}
int main ()
{
    cin >> n >> k;
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    cout << quick_sort(0, n - 1, k) << endl;
    return 0;
}

2、归并排序

主要思想:分治

1、确定分界点mid = (l+r)/2。

2、递归排序左右两边left,right。

3、归并、合二为一(难点)。

​​#include<iostream>
using namespace std;
const int N = 100010;
int n;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;// 特判区间内如果只有一个数或者为空时,直接return;
    int mid = l + r >> 1;//确定分界点mid
    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(i <= mid) tmp[k++] = q[i++];//再次查看左边区间是否还有剩余
        while(j <= r) tmp[k++] = q[j++];//再次查看右边区间是否还有剩余
        for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];//把tmp[i] 存到q[j]里
}
int main ()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    merge_sort(q, 0, n - 1);
    for(int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!  

相关文章

  • C++中自定义sleep、条件变量sleep实例

    C++中自定义sleep、条件变量sleep实例

    这篇文章主要介绍了C++中自定义sleep、条件变量sleep实例,本文直接给出实例代码并讲解了功能作用和使用方法,需要的朋友可以参考下
    2015-03-03
  • C语言实现各种排序算法实例代码(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)

    C语言实现各种排序算法实例代码(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)

    排序算法是算法之中相对基础的,也是各门语言的必学的算法,这篇文章主要介绍了C语言实现各种排序算法(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • C语言中无符号数和有符号数之间的运算

    C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。下面通过一个例子给大家分享C语言中无符号数和有符号数之间的运算,一起看看吧
    2017-09-09
  • C++ 迷宫游戏实现代码

    C++ 迷宫游戏实现代码

    这篇文章主要介绍了C++ 迷宫游戏实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C语言实现简易版扫雷的完整过程

    C语言实现简易版扫雷的完整过程

    这篇文章主要给大家介绍了关于利用C语言如何实现简易版扫雷的完整过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 基于C++实现Socket交互式服务端

    基于C++实现Socket交互式服务端

    在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,本文将深入探讨如何通过调用原生网络 API 实现同步远程通信,并介绍了一个交互式 Socket 类的封装,需要的可以参考下
    2024-02-02
  • C/C++中一次性执行多个DOS命令的实现思路

    C/C++中一次性执行多个DOS命令的实现思路

    在C语言中执行DOS命令的方法很多,在这就不一给大家一一介绍了,本文重点给大家介绍C/C++中一次性执行多个DOS命令的实现思路,需要的朋友参考下
    2017-12-12
  • C++面试八股文之std::string实现方法

    C++面试八股文之std::string实现方法

    这篇文章主要介绍了C++面试八股文:std::string是如何实现的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • FFmpeg获取网络摄像头数据解码

    FFmpeg获取网络摄像头数据解码

    这篇文章主要为大家详细介绍了FFmpeg获取网络摄像头数据解码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • c语言读取csv文件和c++读取csv文件示例分享

    c语言读取csv文件和c++读取csv文件示例分享

    这篇文章主要介绍了c语言读取csv文件和c++读取csv文件示例,需要的朋友可以参考下
    2014-03-03

最新评论