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

目录
  • 一、队列是什么?
  • 二、排序算法
    • 1.快速排序
    • 2、归并排序
  • 总结

一、队列是什么?

头文件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;
}

总结

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

(0)

相关推荐

  • C++ 中快排的递归和非递归实现

    快排的递归 void quickSort1(int* root,int low,int high) { int pat=root[low]; if(low<high) { int i=low,j=high; while(i<j) { while(i<j&&root[j]>pat) j--; root[i]=root[j]; while(i<j&&root[i]<pat) i++; root[j]=root[i]; } root[i]=pa

  • C++:函数对象,STL提供的函数对象,函数适配器详解

    目录 1 函数对象 2 STL提供的函数对象 3 函数适配器 总结 1 函数对象 1.函数对象是行为类似函数的对象.一个类对象,表现出一个函数的特征,即通过对象名+(参数列表)的方式使用一个类对象. 2.使用STL中提供的或自定义的迭代器和**函数对象,**配合STL的算法,组合出各种各样的功能. 3.通过函数对象而不使用函数指针,可以增加通用性,提高效率. 4.函数对象概念:泛化的函数 ①将普通函数作为函数对象:传递函数名 #include <iostream> #include <n

  • C++归并排序算法详解

    目录 一.算法简介 二.实现过程 总结 一.算法简介 归并排序算法的平均时间复杂度是O(nlogn),归并算法的实现就是通过分冶法,将一个待排序列分成一个个小的序列,然后对这些小的序列进行排序,然后进行合并,合并的时候也会进行排序,这样,从整体拆成小块,再从小块合成整体的一个过程. 二.实现过程 1)拆分待排序列 2)进行排序合并 给大家写了一个简单的过程以便大家理解. 这基本就是归并排序的实现原理了,那么代码是怎么实现的呢,下面给大家展示下代码实现. //时间复杂度是nlogn #includ

  • C++在成员函数中使用STL的find_if函数实例

    本文实例讲述了C++在成员函数中使用STL的find_if函数的方法.分享给大家供大家参考.具体方法分析如下: 一般来说,STL的find_if函数功能很强大,可以使用输入的函数替代等于操作符执行查找功能(这个网上有很多资料,我这里就不多说了). 比如查找一个数组中的奇数,可以用如下代码完成(具体参考这里:http://www.cplusplus.com/reference/algorithm/find_if/): #include <iostream> #include <algori

  • C++实现归并排序

    定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. 简单的来说,归并排序主要分为三步,一是对数组的划分,二是对数组的排序,三是对数组的合并.划分的大小是可以随自己的想法而设置,但是一般都是以2为单位,这样最小的一组的排序就比较方便. 具体一个简单的例子: 设有数

  • C++编程归并排序算法实现示例

    归并算法开始首先要对一段要有序的数字进行排序 void merg_sort(int* a, int fbegin, int fend, int sbegin, int send, int* b) { int L = fbegin; int R = sbegin; int cursize = fbegin;//z这里不能重0开始 递归后面是按对应开始位置进行赋值的 while (L <= fend && R <= send) { if (a[L] > a[R]) { b[c

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

    目录 一.队列是什么? 二.排序算法 1.快速排序 2.归并排序 总结 一.队列是什么? 头文件queue主要包括循环队列queue和优先队列priority_queue两个容器. 像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端.就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人. 就像管道一样先进先出. 队列的相关概念: 1.队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头.

  • PHP排序算法之基数排序(Radix Sort)实例详解

    本文实例讲述了PHP排序算法之基数排序(Radix Sort).分享给大家供大家参考,具体如下: 基数排序在<大话数据结构>中并未讲到,但是为了凑齐八大排序算法,我自己通过网络学习了这个排序算法,并给大家分享出来. 基本思想: 基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶&quo

  • Python排序算法之插入排序及其优化方案详解

    一.插入排序 插入排序与我们平时打扑克牌非常相似,将新摸到的牌插入到已有的牌中合适的位置,而已有的牌往往是有序的. 1.1 执行流程 (1)在执行过程中,插入排序会将序列分为2部分,头部是已经排好序的,尾部是待排序的. (2)从头开始扫描每一个元素,每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序 1.2 逆序对 数组 <2,3,8,6,1> 的逆序对为:<2,1> ❤️,1> <8,1> <8,6> <6,1>,共

  • Go语言排序算法之插入排序与生成随机数详解

    前言 排序,对于每种编程语言都是要面对的.这里跟大家一起分享golang实现一些排序算法,并且说明如何生成随机数.下面话不多说了,来一起看看详细的介绍吧. 经典排序算法 算法的学习非常重要,是检验一个程序员水平的重要标准.学习算法不能死记硬背,需要理解其中的思想,这样才能灵活应用到实际的开发中. 七大经典排序算法 插入排序 选择排序 冒泡排序 希尔排序 归并排序 堆排序 快速排序 插入排序 先考虑一个问题:对于长度为n的数组,前n-1位都是递增有序的,如何排序? 1.从第1位至第n-1位遍历数组

  • PHP排序算法之堆排序(Heap Sort)实例详解

    本文实例讲述了PHP排序算法之堆排序(Heap Sort).分享给大家供大家参考,具体如下: 算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知道他是最小的记录. 可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较重,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重

  • PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)

    本文实例讲述了PHP中strnatcmp()函数"自然排序算法"进行字符串比较用法.分享给大家供大家参考,具体如下: PHP中strnatcmp()函数使用"自然"算法来比较两个字符串(区分大小写),通常在自然算法中,数字 2 小于数字 10.而在计算机排序中,10 小于 2,这是因为 10 中的第一个数字小于 2. strnatcmp()函数的定义如下: strnatcmp(string1,string2) 参数说明: string1  必需.规定要比较的第一个字

  • TF-IDF算法解析与Python实现方法详解

    TF-IDF(term frequency–inverse document frequency)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术.比较容易理解的一个应用场景是当我们手头有一些文章时,我们希望计算机能够自动地进行关键词提取.而TF-IDF就是可以帮我们完成这项任务的一种统计方法.它能够用于评估一个词语对于一个文集或一个语料库中的其中一份文档的重要程度. 在一份给定的文件里,词频 (term frequency, T

  • 基于js 各种排序方法和sort方法的区别(详解)

    今天突发奇想,想明白sort方法是否比各种排序都有优势,所以就参考别人的代码,做了一个测试,结果令人惊讶啊,上代码. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,max

  • python算法与数据结构之冒泡排序实例详解

    一.冒泡排序介绍 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 二.冒泡排序原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.这一步做完,最后的元素应该会是最大的数. 针对所有的

  • java 算法之归并排序详解及实现代码

    java 算法之归并排序详解 一.思想 归并排序:将一个数组排序,可以先(递归地)将它分成两半部份分别排序,然后将结果归并起来: 二.概念 归并:将两个有序的数组归并成一个更大的有序数组: 三.特点 优点:能够保证将任意长度为N的数组排序所需要的时间和NlogN成正比: 缺点:需要额外的空间和N成正比: 四.实现方法 将两个不同的有序数组归并到第三个数组中: 先将前半部分排序,在将后半部分排序,然后在数组中移动元素而不需要使用额外的空间: 五.代码 /** * 归并排序 * * @author

随机推荐