前言:
基于上图可知,堆排序和归并排序 是一种情况相对来说比较好处理较大数据的算法的排序方法;可利用最大堆/最小堆的构建来进行排序;归并排序的好处是稳定,但是代码量较大
请编写程序对不超过50000个整数递增排序。
输入格式:
输入第一行一个正整数n,表示待排序的元素个数。第二行为n个整数,表示待排序的元素。n不超过50000。
输出格式:
输出为一行,表示排序结果,每个整数后一个空格。
输入样例:
5
5 4 3 2 1
输出样例:
1 2 3 4 5
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
C++(稳定的sort函数)
C++中的sort函数的时间复杂度为O(nlogn)。它使用快速排序(Quick Sort)算法作为默认排序算法,而快速排序的时间复杂度通常为O(nlogn)。不过,在某些情况下,sort函数会使用堆排序(Heap Sort)或归并排序(Merge Sort),它们的时间复杂度也都为O(nlogn)。需要注意的是,sort函数的最坏时间复杂度为O(n^2),但这种情况非常罕见,只有在极端情况下才会出现。
#include<bits/stdc++.h> using namespace std; bool cmp(int x,int y) { return x<y; } int main() { int n; cin>>n; int a[n]; int cnt=0; for(int i=0;i<n;i++) { cin>>a[i]; cnt++; } //稳定性排序 //cmp函数,从小到大排序,如果大小相等的话,不会改变相对顺序 stable_sort(a,a+n,cmp); for(int i=0;i<n;i++) { cout<<a[i]<<" "; } return 0; }
C++ 堆排序算法
#include<bits/stdc++.h> using namespace std; int h[50010]; int n; void down(int u)//堆排序,可用最大堆排序,或最小堆排序 //其中 h[u*2]<h[t];h[u*2]<h[t] 则为最小堆下滤函数 //h[u*2]>=h[t];h[u*2]>=h[t] 则为最大堆下滤函数 { int t=u; if( u*2<=n && h[u*2]<h[t] ) t=u*2; if(u*2 +1 <= n && h[u*2+1]<h[t] ) t=u*2+1; if(u!=t) { swap(h[u],h[t]); down(t); } } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>h[i]; } // 构建最小堆 for(int i=n/2;i;i--) down(i); //排序 while(n) { cout<<h[1]<<" "; swap(h[1],h[n]); n--; down(1); } return 0; }
C++ 归并排序算法
#include<bits/stdc++.h> using namespace std; int a[50010],tmp[50010]; void merge_sort(int left,int right) { if(left>=right)return ; int mid=(left+right)>>1;//这里是位运算,效率更高,这里相当于 // mid=(left+right)/2; merge_sort(left,mid),merge_sort(mid+1,right); int k=0,i=left,j=mid+1; while(i<=mid&&j<=right) { if(a[i]<=a[j])tmp[k++]=a[i++]; else tmp[k++]=a[j++]; } while(i<=mid)tmp[k++]=a[i++]; while(j<=right)tmp[k++]=a[j++]; for(int i=left,j=0;i<=right;i++,j++) a[i]=tmp[j]; } int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } merge_sort(0,n-1); for(int i=0;i<n;i++) { cout<<a[i]<<" "; } return 0; }