排序算法整理

常见考点

  1. 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序
  2. 排序算法的稳定性
  3. 排序算法的时间复杂度

排序算法的稳定性

稳定性是指排序前两个元素a1 = a2,a1在前。排序过后,倘若a1始终在前,则算法是稳定的,否则是不稳定的。

稳定的

冒泡排序、插入排序、归并排序、基数排序

不稳定的

堆排序、快速排序、希尔排序、选择排序

各个算法细锁

冒泡排序

基本思路:双重循环遍历数组,交换两个相邻的逆序的数字。时间复杂度一般 - \(O(n^2)\),最坏 - \(O(n^2)\),最好\(O(n)\)。

代码

  1. for(int i = 1; i <= n; i ++)
  2. {
  3. for(int j = 1; j <= n - i; j ++)
  4. {
  5. if(a[j] > a[j + 1])
  6. swap(a[j], a[j + 1]);
  7. }
  8. }

都说最优复杂度是O(N),但显然这个程序怎么看都是\(O(n^2)\),实际上\(O(n)\)是优化过的。考试的时候记住就行。

选择排序

基本思路:遍历一遍数组 i in (1, n + 1),从 i 数开始遍历到后面,寻找最小的比它小的数,与它交换。

无论如何都是\(O(n^2)\)。

代码

  1. for(int i = 1; i < n; i ++)
  2. {
  3. int min = i;
  4. for(j = i + 1; j <= n; j ++)
  5. {
  6. if(a[min] > a[j])
  7. min = j;
  8. swap(a[i], a[min]);
  9. }
  10. }

归并排序

分治思想,将数组中所有的数递归分为两个一组

网上讲的挺好的归并排序MergeSort(通俗易懂_kevinmeanscool的博客-CSDN

这个算法还能用来求逆序对,所以在复赛中也挺重要 虽然现在一般复赛不会考,只要在else后面(代码)加一句ans += mid - i +1,但我不知道原理。

代码

  1. void merge_sort(int a[], int l, int r){
  2. if(l >= r)
  3. return;
  4. int mid = l + r >> 1;
  5. merge_sort(a, l, mid);
  6. merge_sort(a, mid + 1, r);
  7. int k = 0;
  8. int i = l;
  9. int j = mid + 1;
  10. while(i <= mid && j <= r){
  11. if(a[i] <= a[j])
  12. f[k ++] = a[i ++];
  13. else
  14. f[k ++] = a[j ++];
  15. }
  16. while(i <= mid) f[k ++] = a[i ++];
  17. while(j <= r) f[k ++] = a[j ++];
  18. for(i = l, j = 0; i <= r; i ++, j ++){
  19. a[i] = f[j];
  20. }
  21. }

快速排序

基本思路:找一个基准数,先由i从左边出发,找到一个小于,j再从右边出发,找一个小于基准数的数。分开区间,重复此操作。时间复杂度平均\(O(nlon_n)\),最优也是\(O(nlon_n)\),最差\(O(n^2)\)。

代码

  1. void qsort(int l, int r)
  2. {
  3. int mid = a[l + r >> 1];
  4. int i = l, j = r;
  5. do{
  6. while(a[i] < mid) i ++;
  7. while(a[j] > mid) j --;
  8. if(i <= j)
  9. {
  10. swap(a[i], a[j]);
  11. i ++;
  12. j --;
  13. }
  14. }while(i <= j);
  15. if(l < j) qsort(l, j);
  16. if(i < r) qsort(i, r);
  17. }
  18. int main()
  19. {
  20. qsort(1, n);
  21. }

根据代码图解

(如果加载不出来请刷新,因为图放在Github):

数组:[3, 2, 9, 5, 1, 8, 2]

找到了

交换,注意i ++, j -- 不然会死循环

i 不再动了,因为a[i] = mid

这里没写 i ++, j --

排序算法整理C++(初赛)的更多相关文章

  1. (排序算法整理)NEFU 30/32

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/caihongshijie6/article/details/26165093        事实上, ...

  2. 常用的 JS 排序算法整理

    关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...

  3. 8种Java排序算法整理

    package org.hbz.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; im ...

  4. 常见排序算法整理(python实现 持续更新)

    1 快速排序 快速排序是对冒泡排序的一种改进.  它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行 ...

  5. 洛谷 P1177 【模板】快速排序(排序算法整理)

    P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.( ...

  6. 排序算法整理(Python实现)

    目录 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 归并排序 5. 快速排序 1. 冒泡排序   冒泡排序(Bubble Sort)是稳定排序,其基本思想是:遍历待排序列,依次两两比较,如果顺 ...

  7. 排序算法整理(python version)

    import random import time def bubble_sort(a): n=len(a) while n>1: for i in range(n-1): if a[i]> ...

  8. java小程序整理及排序算法

    1. 利用循环打印如下图形 ***** **** *** ** * public class Main { public static void main(String[] args) { // TO ...

  9. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

随机推荐

  1. centos7.6部署DRBD提示“no resources defined!

    环境准备: node1(主节点)IP: 192.168.26.30 主机名:node1node2(从节点)IP: 192.168.26.31 主机名:node2 1.关闭防火墙和selinux #se ...

  2. 用python做个计算器不是轻轻松松吗~

    计算器 Kivy是一个免费的开源Python库,可以快速轻松地开发高度交互的跨平台应用程序. 这里我将使用Python中的Kivy包来构建一个计算器GUI.(https://jq.qq.com/?_w ...

  3. Multiparty Cardinality Testing for Threshold Private Set-2021:解读

    本文记录阅读该论文的笔记. 本文基于阈值加法同态加密方案提出了一个新的允许\(N\)方检查其输入集的交集是否大于\(n-t\)的IPSI方案,该协议的通信复杂度为\(O(Nt^2)\). 注意:\(N ...

  4. CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析

    目录 1. 3DTiles 数据集的类型 2. 创建瓦片树 2.1. 请求入口文件 2.2. 创建树结构 2.3. 瓦片缓存机制带来的能力 3. 瓦片树的遍历更新 3.1. 三个大步骤 3.2. 遍历 ...

  5. mysql拆分字符串做条件查询

    mysql拆分字符串作为查询条件 有个群友问一个问题 这表的ancestors列存放的是所有的祖先节点,以,分隔 例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查 ...

  6. 微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹

    之前的文章中我们介绍了如何通过 Nocalhost 快速开发 Rainbond 上的微服务,介绍了基本的开发流程. 本文将续接上文继续介绍,使用 Nocalhost 开发配置文件 实现以下内容: 一键 ...

  7. 记一次requests请求乱码的问题

    太懒了,直接说原因吧: 请求返回的内容含有emoji表情 我的解决办法是替换掉emoji字符: 安装库:pip install emoji 替换:emoji.demojize(CONTENT) 注意, ...

  8. nexus org.sonatype.nexus.bootstrap.jetty.JettyServer - Start failed

    INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - Runningjvm 1 | 2020-04- ...

  9. 11 MySQL_分组查询和关联查询

    分组查询 group by 将某个字段的相同值分为一组,对其他字段的数据进行聚合函数的统计,称为分组查询 单字段分组查询 1.查询每个部门的平均工资 select dept_id,avg(sal) f ...

  10. 虚拟机上安装Linux系统

    1,打开VMware,文件--新建虚拟机 2,选择自定义 3,选择VMware版本,下一步 4,选择稍后安装操作系统,下一步 5,选择Linux,版本我这里用的是centos7 6, 设置虚拟名称,设 ...