排序算法整理

常见考点

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

排序算法的稳定性

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

稳定的

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

不稳定的

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

各个算法细锁

冒泡排序

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

代码

for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= n - i; j ++)
{
if(a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}

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

选择排序

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

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

代码

for(int i = 1; i < n; i ++)
{
int min = i;
for(j = i + 1; j <= n; j ++)
{
if(a[min] > a[j])
min = j;
swap(a[i], a[min]);
}
}

归并排序

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

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

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

代码

void merge_sort(int a[], int l, int r){
if(l >= r)
return;
int mid = l + r >> 1;
merge_sort(a, l, mid);
merge_sort(a, mid + 1, r);
int k = 0;
int i = l;
int j = mid + 1;
while(i <= mid && j <= r){
if(a[i] <= a[j])
f[k ++] = a[i ++];
else
f[k ++] = a[j ++];
}
while(i <= mid) f[k ++] = a[i ++];
while(j <= r) f[k ++] = a[j ++];
for(i = l, j = 0; i <= r; i ++, j ++){
a[i] = f[j];
} }

快速排序

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

代码

void qsort(int l, int r)
{
int mid = a[l + r >> 1];
int i = l, j = r;
do{
while(a[i] < mid) i ++;
while(a[j] > mid) j --;
if(i <= j)
{
swap(a[i], a[j]);
i ++;
j --;
}
}while(i <= j);
if(l < j) qsort(l, j);
if(i < r) qsort(i, r);
}
int main()
{
qsort(1, n);
}

根据代码图解

(如果加载不出来请刷新,因为图放在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. 关于Vue在面试中常常被提到的几点(持续更新……)

    1.Vue项目中为什么要在列表组件中写key,作用是什么? 我们在业务组件中,会经常使用循环列表,当时用v-for命令时,会在后面写上:key,那么为什么建议写呢? key的作用是更新组件时判断两个节 ...

  2. 『现学现忘』Docker基础 — 38、COPY指令和ADD指令

    目录 1.COPY指令 (1)COPY指令说明 (2)COPY指令格式 (3)COPY指令使用 (4)其他 2.ADD指令 (1)ADD指令说明 (2)ADD指令格式 (3)ADD指令使用 (4)不推 ...

  3. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  4. UiPath存在图像Image Exists的介绍和使用

    一.Image Exists的介绍 检查是否在指定的UI元素中找到图像,输出的是一个布尔值 二.Image Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为 ...

  5. TypeScript let与var的区别

    1.作用域不同 用var声明的变量,只有函数作用域和全局作用域,没有块级作用域.而let可以实现块级作用域,只能在代码块{}内有效,在{}之外不能访问,如下代码所示: { let a = 0; var ...

  6. 你真的了解JAVA中对象和类、this、super和static关键字吗

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 Java对象究竟是什么? 创建对象的过程 ...

  7. 一种新的UI测试方法:视觉感知测试

    什么是视觉测试 视觉测试(Visual Testing),主要检查软件用户界面(UI)是否正确显示给所有用户.它检查网页上的每个元素的形状.大小和位置是否符合预期,还检查这些元素是否在不同的设备和浏览 ...

  8. NOI / 1.4编程基础之逻辑表达式与条件分支讲解-01:判断数正负

    总时间限制: 1000ms 内存限制: 65536kB 题目: 描述 给定一个整数N,判断其正负. 输入 一个整数N(-109 <= N <= 109) 输出 如果N > 0, 输出 ...

  9. c++头文件的一个误导

    通常情况下,我们都认为c++的头文件是这样的: #include <bits/stdc++.h> using namespace std; int main() 但c++也可以用c的头文件 ...

  10. 用kubeadm简单部署k8s

    一.环境准备 1.三台CentOS6.7虚拟机 master:192.168.0.54 注意:主节点最好是2颗cpu,否则在k8s控制平面初始化的时候会报错: node1:192.168.0.68 n ...