冒泡排序问题

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;
}

法三 标记数组

猜你喜欢

转载自blog.csdn.net/haoff_20/article/details/81745980