十大排序算法及C++实现
发布日期:2021-09-14 15:32:55 浏览次数:14 分类:技术文章

本文共 2434 字,大约阅读时间需要 8 分钟。

算法 平均时间复杂度 最好 最坏 空间复杂度 稳定性
冒泡排序 o(n2) o(n) o(n2) o(1) 稳定
选择排序 o(n2) o(n2) o(n2) o(1) 不稳定
插入排序 o(n2) o(n) o(n2) o(1) 稳定
希尔排序 o(nlogn) o(nlog2n) o(nlogn) o(1) 不稳定
归并排序 o(nlogn) o(nlogn) o(nlogn) o(n) 稳定
快速排序 o(nlogn) o(nlogn) o(n2) o(logn) 不稳定
堆排序 o(nlogn) o(nlogn) o(nlogn) o(1) 不稳定
计数排序 o(n+k) o(n+k) o(n+k) o(k) 稳定
桶排序 o(n+k) o(n+k) o(n2) o(k) 稳定
基数排序 o(n*k) o(n*k) o(n*k) o(n+k) 稳定
  • 什么是排序算法的稳定性?
    若排序前数组元素中有相同元素,如两个10,其中10*在10`之前。若排序后相同元素的相对位置保持不变,则称排序算法是稳定的。
  • 排序算法的稳定性有什么用?

冒泡排序:

for(int i=0;i
arr[j+1]) {
swap(arr[j],arr[j+1]); isSort=false; } } if(isSort) break;}

归并排序:

核心思想是分治法,将数组一分为二,排序后再合并。

//合并两个有序数组void merge(vector
arr,vector
tempArr,int start,int mid,int end){
//复制要合并的数组 for(int i=start;i<=end;i++) tempArr[i]=arr[i] //左半部分从left开始,右半部分从right开始 int left=start,right=mid+1; for(int i=start;i<=end;i++){
if(left>mid) arr[i]=tempArr[right++]; else if(right>end) arr[i]=tempArr[left++]; else if(tempArr[right]
arr,vector
tempArr,int start,int end){
if(end<=start) return; int mid=start+(end-start)/2; sort(arr,tempArr,start,mid); sort(arr,tempArr,mid+1,end); merge(arr,tempArr,start,mid,end);}

代码注释

left>mid||tempArr[right]<tempArr[left]第一种情况是左半边数据已经排完了,第二种情况左半边的数据更大;这两种情况下将右半边数据排入。
right>end||tempArr[left]<tempArr[right]第一种情况是右半边数据已经排完了,第二种情况右半边的数据更大;这两种情况下将左半边数据排入。
时间复杂度,merge()是o(n),分割是o(logn)。相乘。


快速排序:

核心思想也是分治法。

int partition(vector
arr,int start,int end){
int pivot=arr[start]; int mark=start; for(int i=start+1;i<=end;i++){
if(arr[i]
arr,int start,int end){
if(end<=start) return; int pivotIdx=partition(arr,start,end); sort(arr,start,pivotIdx-1); //每趟排序之后,基准值pivot都到了它的排序位置。 sort(arr,pivotIdx+1,end);}

最好情况:每次的基准值都平均将数组划分为等长的两部分。o(nlogn)

最坏情况:每次都将数组划分时,只划分出一边。不均衡。o(n2)


堆排序:是一种优先队列。有两种实现方法, 最大堆和最小堆。升序用最大堆。

void sink(vector
arr,int index,int n){
int leftchild=2*index+1;//左子节点下标 int rightchild=2*index+2;//右子节点下标 int cur=index; if(leftchild
arr[cur]) cur=leftchild; if(rightchild
arr[cur]) cur=rightchild; if(cur!=index){
swap(arr[cur],arr[index]); sink(arr,cur,n); }}void buildHeap(vector
arr,int n){
for(int i=n/2;i>=0;i--) sink(arr,i,n);}void sort(vector
arr){
buildHeap(arr,arr.size()); int n=arr.size(); for(int i=arr.size()-1;i>0;i--){
swap(arr[0],arr[i]);//堆顶元素移动到末尾并交换 n--; sink(arr,0,n);//重新构建堆 }}

转载地址:https://blog.csdn.net/weixin_42490152/article/details/100939013 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:lower_bound()函数与upper_bound()函数
下一篇:网易互娱游戏研发面经及答案:算法编程题

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月19日 16时17分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

计算机视觉与深度学习 | 动态背景下的前景目标提取 2021-07-01
《数据“科学家”必读》 | 从零起步打造数字化业务「最强大脑」 2021-07-01
好消息!Azure Active Directory 域服务在中国区正式发布! 2021-07-01
《数据“科学家”必读》 | 与Cosmos DB实现数据同步 2021-07-01
官宣:在微软智能云 Azure 上可以部署红帽 OpenShift 啦,快来康康怎么操作 2021-07-01
以己之盾,御彼之矛——你需要知道的安全总览浅析 2019-04-28
毕业十年即登全球副总裁,微软的这个后浪有点强 2019-04-28
云基础架构采用者避坑指南:拥抱“云”,更懂“云” 2019-04-28
《数据“科学家”必读》 | 创建自动化的数据处理水线 2019-04-28
沉入海底 2 年的微软数据中心浮出水面:故障率只有陆地上的 1/8 2019-04-28
硬核科技炸场,Ignite 2020重磅回归 2019-04-28
《数据“科学家”必读》 | (终结篇)省略中间环节,实现数据的直接访问 2019-04-28
错过了 Ignite ?没关系!微软秋季技术课堂强势接档! 2019-04-28
一份微软学习大礼包,速领! 2019-04-28
云原生火爆技术人朋友圈,你可别云里雾里了! 2019-04-28
Azure 服务月度更新盘点 | 九月 2019-04-28
Azure Databricks :链接数据科学与企业AI工具的最佳桥梁 2019-04-28
服务器宕机,我为什么一点也不慌? 2019-04-28
传统IT 向云迁移的实践指南 2019-04-28
云基础架构采用者避坑指南:拥抱“云”,更懂“云” 2019-04-28