Problem 9
普通题(simple)
问题描述
老韩让书名号出一道简单题,于是他出了n道题(1-n),让鱼人们去做,并让它们给出每道题的普通指数ai,你能帮帮书名号,帮他把题目按照普通度排序么?
一句话题意:给出n个权值,按照权值从小到大将编号排序。
数据保证权值不重复。
输入格式
第一行一个整数n,代表题目的数量。
第二行n个数字,代表每道题的权值。
输出格式
一行,数字间用空格隔开。
输入样例
10
10 20 30 40 90 80 70 60 50 100
输出样例
1 2 3 4 9 8 7 6 5 10
数据范围与约定
0<=n<=1000000,0<=ai<=1000000。
提示:对于30%的数据,O(n²)会TLE,
基本入门法
冒泡排序
法1 结构体
#include<iostream>
#include<cmath>
using namespace std;
struct item{
int ai;
int no;
};
item d[1000010];
int n;
int main(){
cin>>n;
for(int i=1; i<=n; i++){
cin>>d[i].ai;
d[i].no=i;//结构体输入 相当如标记每个难度
}
//冒泡排序
for(int i=1; i<n; i++){
for(int j=1; j<=n-i; j++)
if(d[j].ai>d[j+1].ai){
item t=d[j];//d[j]的数据整体给了t
d[j]=d[j+1];
d[j+1]=t;
}
}
for(int i=1; i<n; i++)
cout<<d[i].no<<" ";//控制最后一个后面没有空格
cout<<d[n].no<<endl;
return 0;
}
法2 二维数组
#include<iostream>
#include<cmath>
using namespace std;
int d[1000010][2];//定义二维数组
int n;
int main(){
cin>>n;
for(int i=1; i<=n; i++){
cin>>d[i][0];
d[i][1]=i;
}
for(int i=1; i<=n-1; i++){
for(int j=1; j<=n-i; j++)
if(d[j][0]>d[j+1][0]){
int t=d[j][0];
d[j][0]=d[j+1][0];
d[j+1][0]=t;
t=d[j][1];
d[j][1]=d[j+1][1];
d[j+1][1]=t;
}
}
for(int i=1; i<n; i++)
cout<<d[i][1]<<" ";
cout<<d[n][1]<<endl;
return 0;
}
法三 标记数组