首页 > 编程语言 >排序算法整理C++(初赛)

排序算法整理C++(初赛)

时间:2022-09-04 10:57:07浏览次数:94  
标签:int 复杂度 mid C++ ++ 算法 初赛 排序

排序算法整理

常见考点

  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]

初始.png

找到了

第一轮.png

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

第一轮交换.png

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

第二轮.png

这里没写 i ++, j --

第二轮交换.png

标签:int,复杂度,mid,C++,++,算法,初赛,排序
From: https://www.cnblogs.com/huaziqi/p/16654520.html

相关文章

  • java 实现冒泡排序
    先循环一次将数组内部的最大元素排序到最后一位importjava.util.Arrays;publicclassMain{ publicstaticvoidmain(String[]args){ int[]arr1={2,5,8,......
  • 列表排序
    列表排序给定一个$n$行$m$列的整数列表。列表中每一行的$m$个整数都是一个$1\simm$的排列。现在,你可以对该列表执行以下两种操作:选择一行中的两个整数并交......
  • leetcode 面试题08.08 有重复字符串的排列组合 C/C++ 排序 + 深度优先搜索(分支限界)
    #include<iostream>#include<algorithm>#include<vector>usingnamespacestd;classSolution{public:vector<string>permutation(stringS){sort(S.begin(......
  • 归并排序
    需要额外空间的外部排序?菜鸟教程版本这个版本的写法很不一样,首先,它每次都copy构造了两个子数组,然后再从这两个子数组中挑元素往原数组放构造的两个子数组容量都+1,并且......
  • c和c++基本数据类型
    必备知识常量在程序中不可以更改的量.一般以值的形式存在例子33.5’a‘变量在程序中可以改变的量注意必须先定义,才能使用定义变量:类型变量名例子inta......
  • 【C++】C++ qt 与 python 简单进程通讯
    前言准备用C++写一个简单的文字转语音的小东西,对C++qt这个怎么弄不太清楚(现在看到qt5.8后有个叫QTextToSpeech的东西),发现python调用一些库来进行文字转语音的发声比较简......
  • 排序
    其实排序能用的上的就三个:快排,归并,基排(\(O(wys)\))。(其实priority_queue可能也算)快排很好说,sort就行。还有一个stable_sort是相同大小元素顺序不变的稳定排序算法。(事实上......
  • leetcode 77 组合 C/C++ 深度优先搜索
    #include<iostream>#include<vector>usingnamespacestd;classSolution{public:voidrecursive(intn,intk,intvalue,intindex,vector<int>&com_case,ve......
  • js 实现快速排序
    //快速排序//稳定性//快速排序是以两个游标(指针)双向遍历,当两个指针相遇则遍历结束,并将相遇位置与基准值进行交换,递归出口为左游标>=右游标//快速排序的每一轮处理......
  • 饮冰三年-人工智能-Pandas-78-Pandas 新增、统计、排序
    上一篇:饮冰三年-人工智能-Pandas-77-Pandas数据查询 数据准备可参考:饮冰三年-人工智能-Django淘宝拾遗-75-数据准备一、新增数据列1.1直接赋值#1:直接赋值(将性别......