(C/C++)STL函数和排序算法:快排以及归并排序

简介: (C/C++)STL函数和排序算法:快排以及归并排序

一、队列是什么?


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


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


就像管道一样先进先出。


队列的相关概念:


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

入队:队列的插入操作。

出队:队列的删除操作。

队列的声明:                                                                                                                        

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

1669436816749.jpg

(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、递归处理左右两段。


1669436893779.jpg


##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个数

1669436917370.jpg

#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、归并、合二为一(难点)。

1669436957484.jpg

#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;
}
相关文章
|
8天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
23 7
|
26天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
51 4
|
27天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
64 5
|
27天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
49 2
|
1月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
51 0
|
11天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
22 0
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
83 5
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
76 1
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。