这三个排序算法一直是面试的重点,大多数都是C语言写的,今天整理了一下C++的写法,思想都差不多。这几个排序经常忘记,今天抽空记在这,以便自己以后查阅,不对的地方,也欢迎大家评论,不吝指正,谢谢!

二分查找(时间复杂度是O(logn))

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,二分查找方法适用于不经常变动而查找频繁的有序列表。

要求:

1、必须采用顺序存储结构 2、必须按关键字大小有序排列。

下面是二分查找的递归方式和非递归方式的代码:

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//二分查找 O(logN) 非递归
template <typename T> int BinarySearch(const vector<T> &a, const T &x)
{
    int low = 0, high = a.size() - 1;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (a[mid] < x)
            low = mid + 1;
        else if (a[mid] > x)
            high = mid - 1;
        else
            return mid;
    }
    return -1;//NOT_FOUND
}
//递归
template <typename T> int BinarySearch(const vector<T> &a, int low, int high const T &x)
{
    if (low <= high)
    {
        int mid = (low + high) / 2;
        if (a[mid] < x)
            return BinarySearch(a, mid + 1, high, x);
        else if (a[mid] > x)
            return BinarySearch(a, low, mid - 1, x);
        else
            return mid;
    }
    return -1;//NOT_FOUND
}
并排序:

归并排序:(时间复杂度是O(nlogn),空间复杂度是O(n),稳定)

比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到temp[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到temp[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到temp中从下标k到下标high的单元。归并排序的算法我们通常用递归实现,先把待排序区间[low,high]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[low,high]。

代码如下:

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//归并
void mergeAray(vector<int> &a, int low, int mid, int high, vector<int> &temp)
{
    int i = low, j = mid + 1;
    int m = mid, n = high;
    int k = 0;
    while (i <= m && j <= n)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while (i <= m)
        temp[k++] = a[i++];
    while (j <= n)
        temp[k++] = a[j++];
    for (i = 0; i < k; i++)
        a[low + i] = temp[i];
}
void mergeSort(vector<int> &a, int low, int high, vector<int> &temp)
{
    if (low < high)
    {
        int mid = (low + high) / 2;
        mergeSort(a, low, mid, temp);
        mergeSort(a, mid + 1, high, temp);
        mergeAray(a, low, mid, high, temp);
    }
}
void MergeSort(vector<int> &a, int n)
{
    vector<int> p(n);
    if (p.size() == 0)
        return;
    mergeSort(a, 0, n - 1, p);
}

快排(时间复杂度:最好情况O(nlogn) 最坏情况O(n^2) 平均情况O(nlogn)  不稳定)

快速排序算法是对冒泡排序的一种改进。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

即,找一个合适的基准数,比基准数大的移到基准数右边,比基准数小的放到基准数左边。

代码如下:

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//快速排序
void QuickSort(vector<int> &s, int left, int right)
{
    if (left > right)
        return;
    else
    {
        int temp = s[left], i = left, j = right;
        while (i < j)
        {
            while (i < j && s[j] > temp) j--;
            s[i] = s[j];
            while (i < j && s[i] < temp) i++;
            s[j] = s[i];
        }
        s[i] = temp;
        QuickSort(s, left, i - 1);
        QuickSort(s, i + 1, right);
    }
}

二分查找 归并排序 快排 详解C++相关推荐

  1. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  2. python bisect_Python实现二分查找与bisect模块详解

    前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...

  3. 【数据结构】——快排详解

    文章目录 1.快排的含义 2.快排的实现 2.1思路讲解 2.2代码实现 3.快排的时间复杂度分析 4.快排的优化 上一篇文章我们介绍了八大排序中的七种,今天这篇文章主要来详细介绍一种比较重要也是常用 ...

  4. 满满干货:二分查找/排序 编程题详解

    铁汁们~今天给大家分享一篇有关二分查找/排序 编程题详解(牛客网),满满干货,来吧,开造⛳️ 先给大家说些小知识点: 1.指针变量名[整数]=*(指针变量名+整数): 2.知识点:双指针 双指针指的是 ...

  5. 二分查找的魔鬼细节详解

    目录 二分查找的框架 基本二分查找--寻找一个数 寻找左侧边界的二分查找 寻找右侧边界的二分查找 二分查找的思想就是通过判断中间值与目标值的大小来逐步缩短目标区间 将大规模问题转换为若干个子问题,解在 ...

  6. 23行代码_动图展示——快排详解(排序最快的经典算法)

    快排 1.快排的实现逻辑: 先从数列中取出一个数作为基准数(通常取第一个数). 遍历序列,将比它小的数与比它大的数分别记录下来,分为两类,最后该数放在这两类数中间(它左边的所有数都比它小,右边的所有数 ...

  7. 二分查找之C#实现详解

    [前置知识] 二分查找是对有序数组(向量)而言的,所以在使用二分查找前要确保数组已经是顺序的(用到排序算法). [二分查找原理] 聚会时通常会玩猜数字的游戏: 先由坐庄的人来写一个数字(比如在1~10 ...

  8. linux shell 字符串操作(长度,查找,替换)详解 BASH

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  9. LeetCode 327. 区间和的个数(multiset二分查找/归并排序)

    文章目录 1. 题目 2. 解题 2.1 动态规划超时 2.2 二分查找 2.3 归并排序 1. 题目 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 low ...

最新文章

  1. python 十进制转二进制,十进制转八进制,十进制转十六进制 的方法
  2. [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n
  3. 简单的信誉算法 js处理
  4. Java异常处理(1)--异常概述与异常体系结构
  5. java先抽到红球获胜,【图片】红蓝球概率问题,通过程序模拟抽取,计算结果已出,有兴趣来看【非现役文职吧】_百度贴吧...
  6. 手机出货量暴跌!00后4年没换手机:除了贵、穷还有别的原因...
  7. router-link 绑定事件不生效
  8. 基于VUE的酒店管理系统的设计与实现
  9. 桥接、交换机、路由器、网桥、网关
  10. 概率练习 (16.04.30)
  11. CVTE(视源股份)前端实习生面经
  12. 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(3)
  13. 万用表测占空比怎么接_如何使用万用表测量频率和占空比?
  14. protoc编译错误
  15. Dense Prediction
  16. GB/T 33582-2017机械产品结构有限元力学分析通用规则
  17. YouTube-8M
  18. 【Google谷歌翻译】Zotero翻译插件中的引擎不可用,解决
  19. JavaScript跳转和打开新窗口
  20. 四大里snr是什么职位_德勤毕马威普华永道最近都有年轻员工去世,四大会计事务所真是血汗工? 爱问知识人...

热门文章

  1. AVAGO MegaRAID SAS 9361-8i配置IPMI以及JBOD直通模式
  2. 如何用不到10元人民币 DIY 一个 YubiKey
  3. java xml 简单,什么是最简单和简约的java xml api?
  4. 笨办法学python ex11-20
  5. C919背后的中国IT力量
  6. 用户配置文件passwd、密码配置文件shadow、用户组配置文件group、用户及用户组管理
  7. 自动化运维工具-提升运维舒适度
  8. eclipse反编译不起作用
  9. C++内存管理(4):malloc的秘密
  10. 亚信笔试题卷以及答案.docx