谅作者水平不高,请各位神犇勿喷
问题描述
输入 n n n (n<=10000)个整数,排序后,按由小到大的顺序输出。
输入格式
第一行 一个整数
n
n
n。
第二行
n
n
n 个由空格间隔的整数。
输出格式
n n n 个由小到大排列的整数,用空格间隔样例输出。
样例输入
8
16 7 23 8 99 120 35 -2
样例输出
-2 7 8 16 23 35 99 120
提示
输入的整数绝对值大小不超过 32768 32768 32768 。
时间限制 : 3000 MS 空间限制 : 65536 KB
一些闲话
此题 sort
直接过是可以的,简单方便。
下面给出代码:
#include<bits/stdc++.h>
using namespace std;
int a[10010],n;
int main(){
cin>>len;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1); //默认从小到大
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
冒泡排序
冒牌排序重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。——摘自《百度百科》
百度百科已经把冒泡排序讲得蛮清楚的了,就是有一个目标状态(从小到大或从大到小)。每一次我们都检查这个序列中有没有逆序对,如果有,就交换他们。
重要的是 直到没有相邻元素需要交换 这句话,意思就是说如果一次遍历下来,没有出现一个逆序对,那么就表示这个序列已经变成了目标序列,这个时候就可以跳出循环了,这可以为我们省下很多时间。
那么,上代码~
#include<bits/stdc++.h>
using namespace std;
int a[10010],n;
bool t;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int j=1;j<=n;j++){
for(int i=1;i<n;i++){
if(a[i] > a[i + 1]){ //如果有逆序对
swap(a[i],a[i + 1]); //交换函数
t = 1; //记录有逆序对
}
}
if(!t) break; //没有发现逆序对就结束
t = 0;
}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
最坏情况下,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
结语
此题并不难,适合刚学了数组的初学者的拓展,想要更深入的学习排序算法,这里推荐一个神犇的讲解
谢谢观看