十大排序(上)
创始人
2024-02-10 21:18:50
0

目录

一.选择排序

定义

性质

稳定性

时间复杂度

代码实现

二.冒泡排序

定义

过程

性质

稳定性

时间复杂度

代码实现

三.插入排序 

定义

性质

稳定性

时间复杂度

代码实现

 四.计数排序

定义

过程

计算前缀和的原因

性质

稳定性

时间复杂度

代码实现

 五.基数排序

定义

过程

性质

稳定性

时间复杂度

空间复杂度

算法实现


今天我们开始排序算法的学习,本篇文章主要讲述选择排序,插入排序,冒泡排序,计数排序,基数排序.

其他五个排序算法太low了,这里就不细讲了.(主要是因为我不会)

一.选择排序

定义

选择排序(英语:Selection sort)是一种简单直观的排序算法。它的工作原理是每次找出第i小的元素(也就是A_{i...n}中最小的元素),然后将这个元素与数组第i个位置上的元素交换。

 

性质

稳定性

由于 swap(交换两个元素)操作的存在,选择排序是一种不稳定的排序算法。

时间复杂度

选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为 O(n^{2})

代码实现

void selection_sort(int* a,int n){for(int i=1;i

二.冒泡排序

定义

冒泡排序(英语:Bubble sort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。

过程

它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时,排序就完成了。

经过i次扫描后,数列的末尾i项必然是最大的i项,因此冒泡排序最多需要扫描n-1遍数组就能完成排序。

性质

稳定性

冒泡排序是一种稳定的排序算法。

时间复杂度

在序列完全有序时,冒泡排序只需遍历一遍数组,不用执行任何交换操作,时间复杂度为O(n) 。

在最坏情况下,冒泡排序要执行(n-1)*n/2次交换操作,时间复杂度为O(n^{2}) 。

冒泡排序的平均时间复杂度为 O(n^{2}) 。 

代码实现

void bubble_sort(int *a,int n){bool flag=true;while(flag){flag=false;for(int i=1;ia[i+1]){flag=true;int t=a[i];a[i]=a[i+1];a[i+1]=t;}}}
}

三.插入排序 

本页面将简要介绍插入排序。

定义

插入排序(英语:Insertion sort)是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。

一个与插入排序相同的操作是打扑克牌时,从牌桌上抓一张牌,按牌面大小插到手牌后,再抓下一张牌。

性质

稳定性

插入排序是一种稳定的排序算法。

时间复杂度

插入排序的最优时间复杂度为O(n) ,在数列几乎有序时效率很高。 

插入排序的最坏时间复杂度和平均时间复杂度都为O(n^{2}) 。 

代码实现

void insertion_sort(int* a,int n){for(int i=2;i<=n;++i){int key=a[i];int j=i-1;while(j>0&&a[j]>key){a[j+1]=a[j];--j;}a[j+1]=key;}
}

 四.计数排序

Warning

本页面要介绍的不是基数排序

定义

计数排序(英语:Counting sort)是一种线性时间的排序算法。

过程

计数排序的工作原理是使用一个额外的数组C ,其中第i个元素是待排序数组 A中值等于i 的元素的个数,然后根据数组C来将A中的元素排到正确的位置。

它的工作过程分为三个步骤:

  1. 计算每个数出现了几次;
  2. 求出每个数出现次数的 前缀和;
  3. 利用出现次数的前缀和,从右至左计算每个数的排名。

计算前缀和的原因

阅读本章内容只需要了解前缀和概念即可

直接将C中正数对应的元素依次放入A中不能解决元素重复的情形。

我们通过为额外数组C中的每一项计算前缀和,结合每一项的数值,就可以为重复元素确定一个唯一排名:

额外数组C中每一项的数值即是该 key 值下重复元素的个数,而该项的前缀和即是排在最后一个的重复元素的排名。

如果按照A的逆序进行排列,那么显然排序后的数组将保持A的原序(相同 key 值情况下),也即得到一种稳定的排序算法。

 

性质

稳定性

计数排序是一种稳定的排序算法。

时间复杂度

计数排序的时间复杂度为O(n+w) ,其中w代表待排序数据的值域大小。

代码实现

const int N=100010;
const int W=100010;
int n,w,a[N],cnt[W],b[N];
void counting_sort(){memset(cnt,0,sizeof(cnt));for(int i=1;i<=n;++i) ++cnt[a[i]];for(int i=1;i<=w;++i) cnt[i]+=cnt[i-1];for(int i=n;i>=1;--i) b[cnt[a[i]]--]=a[i];
}

 五.基数排序

定义

基数排序(英语:Radix sort)是一种非比较型的排序算法,最早用于解决卡片排序的问题。

过程

基数排序的工作原理是将待排序的元素拆分为k个关键字(比较两个元素时,先比较第一关键字,如果相同再比较第二关键字……),然后先对第 k关键字进行稳定排序,再对第k-1关键字进行稳定排序,再对第k-2关键字进行稳定排序……最后对第一关键字进行稳定排序,这样就完成了对整个待排序序列的稳定排序。

性质

稳定性

基数排序是一种稳定的排序算法。

时间复杂度

一般来说,如果每个关键字的值域都不大,就可以使用 计数排序 作为内层排序,此时的复杂度为 O(nk+\sum_{i=1}^{k}w_{i}),其中w_{i}为第i关键字的值域大小。如果关键字值域很大,就可以直接使用基于比较的O(nk log n)排序而无需使用基数排序了。

空间复杂度

基数排序的空间复杂度为O(k+n) 。

算法实现

const int N=100010;
const int W=100010;
const int K=100;
int n,w[K],k,cnt[W];
struct Element{int key[K];bool operator<(const Element& y)const{for(int i=1;i<=k;++i){if(key[i]==y.key[i])continue;return key[i]=1;--i) b[cnt[a[i].key[p]]--]=a[i];memcpy(a,b,sizeof(a));
}
void radix_sort(){for(int i=k;i>=1;--i){counting_sort(i);}
}

 本来已经准备好的动图他突然传不上来了,只好在baike.baidu.com上面寻找(复制).所以对于萌新来说比较难理解(我就是萌新).

相关内容

热门资讯

环境描写死气沉沉句子精选98... 环境描写死气沉沉句子 精选69句1. 教室中死气沉沉,同学们个个都泪流满面,惟有几位同学装作一脸苦笑...
一生能遇到的句子精选420句 一生能遇到的句子 精选63句1. 选择你所爱的,然后爱你所选择的。2. 你的温柔,我懂,你的疼爱,我...
诚信的句子 有关诚信的句子大全  诚信是一种美德,会让你更加完美。下面是小编整理的有关诚信的句子大全,欢迎阅读!...
时间过得快的搞笑句子精选26... 时间过得快的搞笑句子 精选132句1. 我们不可能都成为英雄。2. 要找出时间来考虑一下,一天中做了...
你好六月的优美句子 你好六月的优美句子(精选100句)  在学习、工作或生活中,大家都听说过或者使用过一些比较经典的句子...
怀念好句子大全要短的精选38... 怀念好句子大全要短的 精选35句1. 小学同学聚会能聚这么多人真的不容易,好怀念以前小的时候现在大家...
有哲理的唯美句子精选76句 有哲理的唯美句子 精选50句1. 池塘边的榕树上,还有知了在声声叫着;家门口的小路旁,还有小狗在快乐...
自我独特的个性签名 自我独特的个性签名(精选70句)  不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗...
人类破坏环境污染句子精选30... 人类破坏环境污染句子 精选64句1. 排放的气息,是乌云盖天的狂欢;森林的骤减,是沙漠扩展的心愿;灾...
繁体字情侣个性签名   繁体字情侣个性签名  1、討厭自己想刺猬一樣小心防備。討厭自己想小丑一樣假冒開心。  2、如果決...
抖音名字 抖音名字▼※目录※▼抖音名字(1-100个)抖音名字(101-200个)抖音名字(201-300个)...
爱情的经典个性签名 关于爱情的经典个性签名集锦  1、其实只要两个人幸福就好了,何必在乎别人的眼光和议论。  2、距离让...
女生爱情个性签名 女生爱情个性签名  永远都不好停止微笑,即使是在你难过的时候,说不定有人会正因你的笑容而爱上你。以下...
微信名字最好听的昵称(精选5... 微信名字最好听的昵称(精选500个)  一、什么是网名  网名指在网上使用的名字。由于网络是一个虚拟...
塘尾村 塘尾村广东省东莞市石排镇塘尾村塘尾村(广东省东莞市石排镇塘尾村)塘尾村位于东莞市石排内,古村以古围墙...
父亲节个性签名 父亲节个性签名  引导语:我不害怕前途再多挫折挣扎只是愧疚没能在家给你们报答。下面由yjbys小编与...
感情的个性签名 关于感情的个性签名80条  1、不是所有的牛奶都叫特仑苏,不是所有的喜欢都是爱。  2、如果你明明知...
此省人口排名中国第一,GDP... 此省人口排名中国第一,GDP排名中国第一,还是一座历史名城中国历代皇帝中,秦始皇绝对称得上千古一帝。...
开心的个性签名 关于开心的个性签名(通用150句)  开心,汉语词组,意指开露心意、坦诚相待,或者心情舒畅、快乐等。...
情侣签名 情侣签名30句  下辈子我一定要做个男的取个像我这样的女人。下辈子我一定要做个女的嫁个像我这样的男人...