首页 > 其他分享 >排序

排序

时间:2023-01-15 10:12:07浏览次数:39  
标签:计数 复杂度 冒泡排序 关键字 基数排序 排序

计数排序

  • 计数排序是一种计算每个数字出现次数后做值域上的前缀和以对各元素排序的排序方式。

  • 计数排序是一种非比较排序。

  • 具体实现:依次枚举每个元素,将其丢进其关键字对应的桶里(这些桶的管辖范围都是 \(1\),也可以认为计数排序就是桶排序的退化)。全部放置完毕后,做前缀和以求出每个元素的排名。

  • 计数排序的复杂度为 \(O(n+w)\),其中 \(w\) 为关键字值域大小。

基数排序

  • 基数排序是一种对排序各元素的各个关键字依次排序的排序方式,或者说思想。

  • 基数排序是一种非比较排序。

  • 基数排序需要一种稳定算法来完成内层的对关键字排序。

  • 具体实现:

    • 枚举各个关键字并排序。

    • 应当在枚举完毕后 \(k\) 个关键字后使得数组按照后 \(k\) 个关键字有序。

    • 具体来说,就是先对第 \(k\) 关键字排序,然后对第 \(k-1\) 关键字稳定排序,以此类推。

    • 正序倒也可以,但是需要的不是稳定排序而是分进不同的桶内,每个桶分别排序,带来的空间复杂度难以忽视。

  • 实际使用中,内部排序算法通常为计数排序。此时有总复杂度为 \(O(\sum\limits_{i=1}^k(n+w_i))\),其中 \(w_i\) 为第 \(i\) 关键字的值域大小(相当于做了 \(k\) 次计数排序)。

std::sort 与 std::stable_sort

  • 前者是内省排序:先用快排,分割次数过多时转局部堆排序防退化,当范围足够小时使用插入排序(注意这一步可能会严重增加比较次数,在 \(cmp\) 不是 \(O(1)\) 时影响较大)。

  • 后者在有额外空间的时候是严格归并排序,否则是最优原地后缀排序算法。请注意,这个名字很长的算法的复杂度是 \(O(n\log^2 n)\)。

冒泡排序

  • 冒泡排序的交换次数是总逆序对数。

  • 和比较排序恰好相反,冒泡排序 \(k\) 次后,至少后 \(k\) 个数字的位置是正确的。

  • 冒泡排序 \(k\) 次后,\(i\) 处元素为 \([1,i+k]\) 间的最小值,除非它已经用于 \(<i\) 的地方(即这个结论必须从前向后递推)。

标签:计数,复杂度,冒泡排序,关键字,基数排序,排序
From: https://www.cnblogs.com/weixin2024/p/17053123.html

相关文章

  • Stata:排序
    使用bysort,在分组操作的情况下还要根据额外的变量进行排序时,使用bysortgroupvar(rankvar):正序排序sysusecensus,clear*保留每个区域内人口最少的州,因此按每个区......
  • MySql查看数据库及表容量大小并排序
    MySql查看数据库及表容量大小并排序带刀医生关注IP属地:江苏2022.04.1120:05:34字数85阅读1,219MySql查看数据库及表容量⼤⼩并排序查看所有数据库容量⼤⼩......
  • Python实现排序
    冒泡排序交换排序相邻元素两两比较大小,有必要则交换元素越小或越大,就会在数列中慢慢的交换并“浮”向顶端,如同水泡咕嘟咕嘟往上冒核心算法排序算法,一般都实现为就......
  • Collectors.groupingBy分组后的排序问题
    Collectors.groupingBy分组后的排序问题https://blog.csdn.net/aiji7208/article/details/101291632?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.n......
  • AcWing 786.第k个数(快速排序)
    [原链接](https://www.acwing.com/problem/content/788/题目#include<cstdio>#include<iostream>#include<cstdlib>usingnamespacestd;inta[100100];voidqu......
  • 希尔排序的思路与C++实现
    tags:DSAC++Sort写在前面写一下希尔排序,其实就是插入排序的升级版,不是一次移动一个,而是一次移动一组.回顾插入排序voidInsertionSort(vector<int>&arr){int......
  • 快速排序算法的递归,迭代法实现(C++)
    tags:DSAC++Sort思路分治法主要分成下面三个步骤:选定基准值(默认是数组首元素),这里称为pivot找到基准值待放置的位置(排序之后的位置),将大于基准值的元素放在基准值......
  • 【计算几何】极角排序
    前置知识三角函数。引文给定一个中心点\(O\)与\(n\)个点,求按点与\(O\)的连线与\(x\)轴的夹角排序后的点对。正文显而易见,不论我们如何移动\(O\)点,点对都......
  • 【数据结构与算法】排序算法(Go实现)
    基础排序算法插入排序funcInsertSort(nums[]int){fori:=1;i<len(nums);i++{val:=nums[i]j:=iforj>0&&nums[j-1]>......
  • 用指针数组的形式来比较两个有序数组数据与排序方式是否完全相同
    1#include<iostream>2#include<vector>3usingnamespacestd;4intmain()5{6inta[5]={1,2,3,4,5};//定义两个数组7intb[5]={1,2......