首页 > 试题广场 >

特殊排序

[编程题]特殊排序
  • 热度指数:41329 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一系列整数,将其中最大的数挑出(如果有多个,则挑出一个即可),并将剩下的数进行排序,如果无剩余的数,则输出-1。

输入描述:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。


输出描述:
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
示例1

输入

4
1 3 4 2

输出

4
1 2 3
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(void)
{
    int n;
    vector<int> a;
    
    while(cin >> n)
    {
        a.clear();
        for(int i = 0;i < n;i++)
        {
            int x;
            cin >> x;
            a.push_back(x);
        }
        
        sort(a.begin(), a.end());
        int len = a.size();
        cout << a[len - 1] << endl;//输出排序后的最后一个数
        a.pop_back();//删除最后一个最大数
        
        if(a.size() != 0)//输出剩余序列
        {
            for(vector<int>::iterator it = a.begin();it != a.end();it++)
                cout << *it << ' ';
            cout << endl;
        }
        else
            cout << -1 << endl;
    }
    return 0;
}

发表于 2021-03-13 18:22:01 回复(0)
#include<bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    priority_queue<int, vector<int>, greater<int> > q;
    int n, x, m;
    while(cin >> n)
    {
        m = -1;
        while(n--)
        {
            cin >> x; q.push(x); m = max(m, x); 
        }
        cout << m << '\n'; 
        if(q.size() == 1) cout << -1; 
        else while(q.size() > 1)
        {
            cout << q.top() << ' '; q.pop();
        }
        cout << '\n'; 
    }
    return 0;
}

发表于 2021-01-20 11:54:01 回复(0)
#include<bits/stdc++.h> //万能头
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
    int N;
	while(scanf("%d",&N)!=EOF)
	{
		int a[N];
		for(int i=0;i<N;i++)
		{
			scanf("%d",&a[i]);
		}
		
		sort(a,a+N);

		if(N==1)
		{
			printf("%d\n",a[N-1]);
			printf("-1\n");
		}
		else
		{
			printf("%d\n",a[N-1]);
			for(int i=0;i<N-1;i++)
			{
				
				printf("%d ",a[i]);
			}
			
		}
	} 
	return 0;
}


发表于 2020-09-09 11:06:40 回复(0)
#include<stdio.h>
int main()//1.排序2.控制输出
{
    int n,a[1000],i,j,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)//冒泡的趟数
    {
        for(j=0;j<n-1-i;j++)//比较的次数
        {
            if(a[j]>a[j+1])
            {//交换
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    if(n==1) printf("%d\n-1",a[0]);
    else{
        printf("%d\n",a[n-1]);
        for(i=0;i<n-1;i++)
            printf("%d ",a[i]);    
    }
}

发表于 2020-03-29 15:12:46 回复(0)
Java 解法
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) arr[i] = scanner.nextInt();
        Arrays.sort(arr);
        System.out.println(arr[n-1]);
        if (n>1) for (int i = 0; i < arr.length - 1; i++) System.out.print(arr[i]+" ");
        else System.out.println("-1");
    }
}


发表于 2020-03-18 11:01:53 回复(0)
#include<stdio.h>
(737)#include<limits.h>

void swap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
//冒泡排序
void sort(int nums[],int n){
    for(int i=0;i<n;i++)
        for(int j=0;j<n-1-i;j++)
            if(nums[j]>nums[j+1])
                swap(&nums[j],&nums[j+1]);
}

int main(){
    int n;
    int max = INT_MIN,k=0;
    while(scanf("%d",&n)!=EOF){
        int nums[n];
        //输入数据并找到最大值
        for(int i=0; i<n; i++){
            scanf("%d",&nums[i]);
            if(nums[i]>max)
                max = nums[i];
        }
        //输出最大值
        printf("%d\n",max);
        if(n==1){
            printf("-1");
            break;
        }
        //排序并输出
        sort(nums,n);
        for(int i=0;i<n-1;i++)//不输出最后的最大值
            printf("%d ",nums[i]);
    }
    return 0;
}

发表于 2020-03-09 10:07:47 回复(0)
#include<stdio.h>
/*
要点:对数组进行排序  排完序后 最后一个就是最大值  这里特殊考虑一下数组元素为1个的情况
*/
int a[1000];
void sort(int a[],int n){
for(int i = 0 ;i < n - 1 ;++i){
for(int j = 0 ; j < n - 1 - i ;++j){
if(a[j] > a[j + 1]){
int temp;
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}


int main(){
int number;
while(scanf("%d",&number) != EOF){
for(int i = 0 ; i < number ;++i){
scanf("%d",&a[i]);
}
sort(a,number);
if(number == 1){
printf("%d\n",a[0]);
printf("-1\n");
}else{
printf("%d\n",a[number - 1]);
for(int i = 0 ; i < number - 1 ;++i){
printf("%d ",a[i]);
}printf("\n");
}

}
}
编辑于 2020-02-29 21:10:22 回复(1)
//开始错的两次都是没读懂题目QAQ
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int *a=new int[n],max=-999999,count=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
            if(a[i]>max)
                max=a[i];
        }
        cout<<max<<endl;
        sort(a,a+n);
        if(n==1)
            cout<<"-1"<<endl;
        else{
            for(int i=0;i<n-2;i++)
                cout<<a[i]<<" ";
            cout<<a[n-2]<<endl;
        }
    }
}

发表于 2020-01-15 16:13:16 回复(0)
/*
解题思路:将数据存入数组中,然后利用排序算法升序排列,这里用快速排序算法,先输出数组中最后一个元素,然后在顺序输出数组元素。
        如果n=1代表输出最大值后无元素,则输出-1.
*/
#include<iostream>
using namespace std;

void quickSort(int arr[],int low,int high){  //快速排序算法
    int temp;
    int i=low,j=high;
    if(low<high){
        temp=arr[low];  //第一个元素作为枢纽,进行划分
        while(i<j){
            while(j>i&&arr[j]>=temp)
                --j;
            if(i<j){  //
                arr[i]=arr[j];
                ++i;
            }
            while(i<j&&arr[i]<temp)
                ++i;
            if(i<j){  //
                arr[j]=arr[i];
                --j;
            }
        }
        arr[i]=temp;  //
        quickSort(arr,low,i-1);
        quickSort(arr,i+1,high);
    }
}

int main(){
    int n;  //输入数据个数
    while(cin>>n){
        int i,a[1000];
        for(i=0;i<n;++i)
            cin>>a[i];
        quickSort(a,0,n-1);
        cout<<a[n-1]<<endl;
        if(n==1) cout<<-1<<endl;
        else{
            for(i=0;i<n-2;i++){
                cout<<a[i]<<" ";            
            }
            cout<<a[n-2]<<endl; //不输出最后那个空格
        }
    }
    return 0;
}

发表于 2018-10-15 20:34:13 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        vector<int> v;
        int max=0;
        int maxIndex=0;
        for(int i=0;i<n;i++){
            int number;
            cin>>number;
            if(max<number){
                max=number;
                maxIndex=i;
            }
            v.push_back(number);
        }
        cout<<v[maxIndex]<<endl;
        v.erase(v.begin()+maxIndex);
        sort(v.begin(),v.end());
        for(int i=0;i<v.size();i++){
            cout<<v[i]<<" ";
        }
        if(v.size()==0){
            cout<<-1;
        }
        cout<<endl;
    }
}

发表于 2018-09-12 23:20:43 回复(0)
package com.speical.first;

import java.util.Scanner;

/**
 * 希尔排序
 * 
 * 坑 :如果n == 1,还要再输出个-1
 * @author Special
 * @time 2018/02/09 10:44:22
 */
public class Pro208 {

    public static void XierSort(int[] nums) {
        int steps = nums.length / 3 + 1;
        while(steps > 0) {
            for(int i = steps; i < nums.length; i++) {
                for(int j = i; j >= steps && nums[j] > nums[j - steps]; j--) {
                    int temp = nums[j];
                    nums[j] = nums[j - steps];
                    nums[j - steps] = temp;
                }
            }
            steps--;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        while(input.hasNext()) {
            int n = input.nextInt();
            int[] nums = new int[n];
            for(int i = 0; i < n; i++) {
                nums[i] = input.nextInt();
            }
            XierSort(nums);
            if(n > 0) {
                System.out.println(nums[0]);
            }
            if(n > 1) {
                for(int i = n - 1; i > 0; i--) {
                    System.out.print((i == n - 1 ? "" : " ") + nums[i]);
                }
            }
            else if(n == 1) {
                System.out.print("-1");
            }
            System.out.println();
        }
    }

}
发表于 2018-02-09 11:04:04 回复(0)
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *p, const void *q) {
    return (*(int *)p > *(int *)q) ? 1 : 0;
}

int main(void) {
    int n = 0;
    int i = 0;
    
    while (scanf("%d", &n) != EOF) {
        int arr[n];
        for (i = 0; i < n; i++)
            scanf("%d", &arr[i]);
        qsort(arr, n, sizeof(int), cmp);
        printf("%d\n", arr[n-1]);
        if (n-1 == 0) {
            printf("%d\n", -1);
        } else {
            for (i = 0; i < n-2; i++)
                printf("%d ", arr[i]);
            printf("%d\n", arr[n-2]);
        }
    }
    
    return 0;
}

发表于 2017-06-08 20:15:39 回复(0)
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,i,flag=0;
int number[1000]={0};
while(scanf("%d",&n)!=EOF){
    flag=0;
for(i=0;i<n;i++)
{
scanf("%d",&number[i]);
}
sort(number,number+n);
printf("%d\n",number[n-1]);
if(n==1)
{
  printf("-1\n");
}
else
{
for(i=0;i<n-1;i++)
{
if(flag==0)
{
flag=1;
printf("%d",number[i]);
}
else
printf(" %d",number[i]);
}
   printf("\n");
    }
    
   }
 } 
发表于 2016-12-11 16:30:08 回复(0)

python三行解法:

while True:
    try:
        a,b=input(),sorted(list(map(int,input().split())))
        print(b[-1])
        print(" ".join(map(str,b[:-1])) if len(b)>1 else "-1")
    except:
        break
发表于 2017-10-04 09:00:49 回复(0)
//不知道为什么n=1时要输出-1
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        int i;
        int a[1000];
        for(i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        //选择排序
        /*for(i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(a[i]>a[j]){
                    int temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
            }
        }*/
        //冒泡排序
        /*for(i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
                if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }*/
        cout<<a[n-1]<<endl;
        if(n==1) cout<<-1<<endl;
        else{
            for(i=0;i<n-2;i++){
                cout<<a[i]<<" ";            
            }
            cout<<a[n-2]<<endl; 
        }
    }
    return 0;
}

编辑于 2017-12-09 14:26:51 回复(1)
#include<stdio.h>
int main()
{
    int a[1000],n,i,j,t,max,k;
    while(scanf("%d",&n)!=EOF)
        if(n==1)
        {
            scanf("%d",&a[0]);
            printf("%d\n-1\n",a[0]);
        }
        else
            {
            for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        max=a[0];
        k=0;
        for(i=1; i<n; i++)
            if(a[i]>max)
            {
                max=a[i];
                k=i;
            }
        printf("%d\n",max);
        for(i=k; i<n-1; i++)
            a[i]=a[i+1];
            n=n-1;
        for(i=0; i<n; i++)
            for(j=0; j<n-i-1; j++)
                if(a[j]>a[j+1])
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
        for(i=0; i<n-1; i++)
            printf("%d ",a[i]);
        printf("%d\n",a[n-1]);
        }
    return 0;
}
发表于 2017-12-30 21:16:00 回复(0)
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	int n;
	int buf[1001];

	while(scanf("%d",&n)!=EOF){
        int max=0;
		for(int i=0;i<n;i++){
			scanf("%d",&buf[i]);
			if(buf[i]>max){
				max=buf[i];
			}
		}
		printf("%d\n",max);
		if(n==1){
			printf("-1\n");
			break;
		}
		sort(buf,buf+n);
		for(int i=0;i<n-1;i++){
            if(i!=n-2)printf("%d ",buf[i]);
            else printf("%d\n",buf[i]);
		}

	}
	return 0;
}
为啥我在自己的IDE上是对的 在OJ上只通过了10% 而且错误里写案例里我的答案什么都没显示??
编辑于 2017-03-18 15:31:32 回复(8)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 1005;

int num[maxn];

int main()
{
    
    int count = 0;

    int n;
    int tmp;
    while(cin >> n)
    {
        for(int i = 0; i < n; ++i)
        {
            cin >> num[i];
        }
        sort(num, num+n);
        cout << num[n-1] << endl;
        tmp = n-2;
        if(tmp >= 0)
        {
            for(int i = 0; i <= tmp; ++i)
            {
                cout << num[i];
                if(i < tmp) cout << " ";
            }
        }
        else
        {
            cout << -1;
        }
        cout << endl;
    }

    return 0;
}


发表于 2016-08-07 10:49:47 回复(0)
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

int main(){
    int n;
    while(cin >> n){
        vector<int> v;
        //v.resize(n);
        for(int i = 0; i < n; i++){
            /*cin >> v[i];   经典错误!!!!vector容器未开辟大小
            可以用resize()函数初始化vector容器的大小*/
            //cin >> v[i];
            int temp;
            cin >> temp;
            v.push_back(temp);
        }
        sort(v.begin(), v.end());
        cout << v.back() << endl;
        v.pop_back();
        if(v.empty()) cout << "-1" << endl;
        else{
            for(vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it << " ";
            cout << endl;
        }
    }
    return 0;
}

编辑于 2024-02-20 10:17:45 回复(0)

用 vector 读取数据, 这样就可以直接 erase掉MaxNum对应的 数据,用数组的话很烦,

还有就是记录最大值的下标和本身的值,然后erase再sort,就可以输出vector里排序好的值额了
#include <iostream>
#include <cstdio>
#include "vector"
#include "algorithm"
using namespace std;
int main() {
    int N;
    scanf("%d", &N);
    vector<int> num;
    for (int i = 0; i < N; i++) {
        int x;
        scanf("%d", &x);
        num.push_back(x);
    }
    int MaxNum = num[0], MaxIndex = 0;
    for (int i = 0; i < N; i++) {
        if (num[i] > MaxNum) {
            MaxNum = num[i];
            MaxIndex = i;
        }
    }
    num.erase(num.begin() + MaxIndex);

    if (num.empty())
        printf("%d\n%d", MaxNum, -1);
    else {
        printf("%d\n", MaxNum);
        sort(num.begin(), num.end());
        for (vector<int>::iterator it = num.begin(); it != num.end(); it++) {
            printf("%d ", *it);
        }
    }








    return 0;
}


发表于 2023-02-28 21:08:02 回复(0)

问题信息

难度:
158条回答 11211浏览

热门推荐

通过挑战的用户

查看代码