news 2026/9/27 6:46:15

ACM 基本排序算法,归并排序(求逆序对)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACM 基本排序算法,归并排序(求逆序对)

1.归并排序

主要运用到的的思想:分治、递归

功能:1.数组进行排序。
2.计算数组中的逆序对的个数。

时间复杂度:稳定的O(nlogn)
空间复杂度:O(n)

附上模板代码:

#include<bits/stdc++.h>usingnamespacestd;longlongMerge(inta[],intb[],ints,intm,inte){inti=s,j=m+1,k=s;longlongans=0;while(i<=m&&j<=e){if(a[i]<=a[j])b[k++]=a[i++];else{b[k++]=a[j++];//求逆序对ans+=mid-i+1;}}while(i<=m)b[k++]=a[i++];while(j<=e)b[k++]=a[j++];for(intn=s;n<=e;n++)a[n]=b[n];returnans;}voidmergesort(inta[],intb[],ints,inte){longlongans=0;if(s<e){intm=(s+e)/2;mergesort(a,b,s,m);mergesort(a,b,m+1,e);ans+=Merge(a,b,s,m,e);}}inta[100005];intb[100005];intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>a[i];}mergesort(a,b,1,n);for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}

2.冒泡排序

主要思想:不断交换相邻两个逆序的元素。最终将最大排在最后,类似于可乐冒泡。

时间复杂度:O(n²)
空间复杂度:O(n)

#include<bits/stdc++.h>usingnamespacestd;voidbubbleSort(inta[],intn){for(inti=1;i<n;i++){//n-1趟for(intj=1;j<n-i+1;j++){//除去已经排好的i个,所以是枚举n-i+1个if(a[j+1]<a[j]){intt=a[j+1];a[j+1]=a[j];a[j]=t;}}}}inta[100005];intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>a[i];}bubbleSort(a,n);for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}

3.选择排序

主要思想:通过与n次(n为数组的长度)的选择,可以将每次当前为选择的最大(最小)的元素放在相应位置上。
时间复杂度:O(n²)
空间复杂度:O(n)

#include<bits/stdc++.h>usingnamespacestd;voidselectSort(inta[],intn){for(inti=1;i<=n;i++){intMin=i;for(intj=i+1;j<=n;j++){if(a[j]<a[Min]){Min=j;}}intt=a[Min];a[Min]=a[i];a[i]=t;}return;}inta[100005];intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>a[i];}selectSort(a,n);for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}

4.插入排序

主要思想:两层for循环,第一层表示接下来要将前i个排好序,第二个for循环,用于通过比较判断第i个元素应该放在1~i的哪个位置上
时间复杂度:O(n²)
空间复杂度:O(n)

#include<bits/stdc++.h>usingnamespacestd;voidInsertSort(vector<int>&a,intlen){for(inti=1;i<len;++i){inttemp=a[i];for(intj=i-1;j>=0;--j){if(temp<a[j]){a[j+1]=a[j];}else{a[j+1]=temp;break;}}}return;}intmain(){intn;cin>>n;vector<int>a(n);for(inti=0;i<n;++i){cin>>a[i];}InsertSort(a,n);for(inti=0;i<n;++i){cout<<a[i]<<" ";}return0;}

5.希尔排序

主要思想:可以认为是插入排序的plus版,内部多了有个增量因子(i=3*i+1),作为每轮插入排序中第二个for‘循环每次结束后的增加量
时间复杂度:O(n^1.5)左右
空间复杂度:O(n)

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=100005;inta[MAXN],n;voidinsertionSort(inta[],intn,intg){for(inti=1+g;i<=n;i++){inttemp=a[i],j=i-g;for(;j>=1;j-=g){if(a[j]>temp){a[j+g]=a[j];}elsebreak;}a[j+g]=temp;}}voidshellSort(inta[],intn){vector<int>G;for(inti=1;i<=n;){G.push_back(i);i=3*i+1;}for(inti=G.size()-1;i>=0;i--){insertionSort(a,n,G[i]);}}intmain(){scanf("%d",&n);for(inti=1;i<=n;i++){scanf("%d",&a[i]);}shellSort(a,n);for(inti=1;i<=n;i++){printf("%d ",a[i]);}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 6:45:58

MT4 DDE数据交换

本文章只说技术本文章为原创文章&#xff0c;禁止转载。该文章只是技术交流&#xff0c;由此带来的任何问题与文章作者无关&#xff0c;如有疑问请留言。思路&#xff1a;MT4是由迈达克研发的一款交易软件&#xff0c;该软件可以对接很多种交易数据&#xff0c;但是呢&#xff…

作者头像 李华
网站建设 2026/9/27 6:43:23

ESP32与INMP441语音采集实战:I2S接线、配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 6:42:12

GD32烧录全攻略:从工具选型到芯片解锁避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 6:41:44

YOLO训练厨师帽数据集:明厨亮灶穿戴检测实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 6:41:41

STM32 FSMC驱动CH438Q实现8路UART扩展实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华