天天看點

【c/c++程式設計-排序問題】成績排序、整數奇偶排序、國名排序、日志排序、字元串排序成績排序整數奇偶排序1.0成績排序2.0國名排序日志排序整數奇偶排序2.0字元串排序字元串排序3字尾子串排序EXCEL排序特殊排序成績排序3.0大整數排序

目錄

成績排序

整數奇偶排序1.0

成績排序2.0

國名排序

日志排序

整數奇偶排序2.0

字元串排序

解一 

解二 

字元串排序3

字尾子串排序

EXCEL排序

特殊排序

成績排序3.0

大整數排序

成績排序

題目描述:

輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績都按先錄 入排列在前的規則處理。

輸入描述:

輸入多行,先輸入要排序的人的個數,然後輸入排序方法 0(降序)或者 1(升序)再分别輸 入他們的名字和成績,以一個空格隔開 輸出描述: 按照指定方式輸出名字和成績,名字和成績之間以一個空格隔開

輸入樣例#:

3

fang 90

yang 50

ning 70

輸出樣例#:

fang 90

ning 70

yang 50

  • 穩定排序,sort 排序是不穩定的,排序之後相對次序有 可能發生改變。解決這個問題有兩個方法,一個是用 stable_sort 函數,它的用法和 sort 一 樣,但是它是穩定的,是以如果我們遇到有穩定的需求的排序時,可以用它。另一個方法是給 每一個輸入增加一個遞增的下标,然後二級排序,當值相同時,下标小的排在前面 
#include <bits/stdc++.h>
using namespace std;

struct Student{
	string name;
	int grade;
}stu[1000];

bool cmp1(Student a,Student b){
	return a.grade>b.grade;
}//從大到小排序

bool cmp2(Student a,Student b){
	return a.grade<b.grade;
}//從小到大排序

int main(){
	int n,order;
	while(cin>>n){
        cin>>order;
		for(int i = 0;i<n;i++){
			cin>>stu[i].name>>stu[i].grade;
		}
		if(order = 0)
			stable_sort(stu,stu+n,cmp1);
		else
			stable_sort(stu,stu+n,cmp2);
		for(int i = 0;i<n;i++){
			cout<<stu[i].name<<" "<<stu[i].grade<<endl;
		}
		
	} 

	return 0;
}
           

整數奇偶排序1.0

題目描述:

輸入 n 個數進行排序,要求先按奇偶後按從小到大的順序排序。

輸入描述:

第一行輸入一個整數 n,表示總共有多少個數,n<=1000。 第二行輸入 n 個整數,用空格隔開。

輸出描述:

輸出排序之後的結果。

輸入樣例#:

8 1 2 3 4 5 6 7 8

輸出樣例#:

1 3 5 7 2 4 6 
#include <bits/stdc++.h>
using namespace std;

bool cmp(int a,int b){
	if(a%2==b%2) //同奇同偶,按照從小到大排序
	return a<b;
	else
	return (a%2) >(b%2);//奇數在偶數前面
}

int main(){
	int n;
	int a[1005] = {0};
	while(cin>>n){
		for(int i = 0;i<n;i++)
			cin>>a[i];
	sort(a,a+n,cmp);
		for(int i = 0;i<n;i++)
		cout<<a[i]<<" "<<endl;

	} 

	return 0;
}
           

成績排序2.0

題目描述

用一維數組存儲學号和成績,然後,按成績排序輸出。

輸入描述:

輸入第一行包括一個整數N(1<=N<=100),代表學生的個數。
接下來的N行每行包括兩個整數p和q,分别代表每個學生的學号和成績。      

輸出描述:

按照學生的成績從小到大進行排序,并将排序後的學生資訊列印出來。
如果學生的成績相同,則按照學号的大小進行從小到大排序。      
#include <bits/stdc++.h>
using namespace std;

struct Student{
	int id;
	int grade;
}stu[1005];

bool cmp(Student a,Student b){
	if (a.grade != b.grade)
		return a.grade <b.grade;
	else 
		return a.id < b.id;//從小到大 
}

int main(){
	int n;
	while(cin>>n){
		for(int i = 0;i<n;i++)
			cin>>stu[i].id>>stu[i].grade;
			
		sort(stu,stu+n,cmp);
		
		for(int i = 0;i<n;i++)
			cout<<stu[i].id<<" "<<stu[i].grade<<endl;
	} 
	return 0;
}
           

國名排序

題目描述

問題描述: 小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要盡快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎?   例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國

輸入描述:

第一行為一個n(n<=100)表示n個國家,第2行到第n+1行分别為n個國家的名字.      

輸出描述:

輸出n個國家按字典順序的排列.
      

輸入樣例#:

3
China
Canada
America      

輸出樣例

America
Canada
China      
#include <bits/stdc++.h>
using namespace std;


int main(){
	int n;
	
	while(cin>>n){
		string s[n];
		for(int i = 0;i<n;i++)
			cin>>s[i];
			
		sort(s,s+n);
		
		for(int i = 0;i<n;i++)
			cout<<s[i]<<endl;
	} 
	return 0;
}
           

日志排序

題目描述

有一個網絡日志,記錄了網絡中計算任務的執行情況,每個計算任務對應一條如下形式的日志記錄: “hs_10000_p”是計算任務的名稱, “2007-01-17 19:22:53,315”是計算任務開始執行的時間“年-月-日 時:分:秒,毫秒”, “253.035(s)”是計算任務消耗的時間(以秒計) hs_10000_p 2007-01-17 19:22:53,315 253.035(s) 請你寫一個程式,對日志中記錄計算任務進行排序。 時間消耗少的計算任務排在前面,時間消耗多的計算任務排在後面。 如果兩個計算任務消耗的時間相同,則将開始執行時間早的計算任務排在前面。

輸入描述:

日志中每個記錄是一個字元串,每個字元串占一行。最後一行為空行,表示日志結束。日志中最多可能有10000條記錄。
計算任務名稱的長度不超過10,開始執行時間的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗時間小數點後有三位數字。
計算任務名稱與任務開始時間、消耗時間之間以一個或多個空格隔開,行首和行尾可能有多餘的空格。      

輸出描述:

排序好的日志記錄。每個記錄的字元串各占一行。
輸入的格式與輸入保持一緻,輸入包括幾個空格,你的輸出中也應該包含同樣多的空格。
      

輸入樣例#:

hs_10000_p   2007-01-17 19:22:53,315     253.035(s)
hs_10001_p   2007-01-17 19:22:53,315     253.846(s)
hs_10002_m   2007-01-17 19:22:53,315     129.574(s)
hs_10002_p   2007-01-17 19:22:53,315     262.531(s)
hs_10003_m   2007-01-17 19:22:53,318     126.622(s)
hs_10003_p   2007-01-17 19:22:53,318     136.962(s)
hs_10005_m   2007-01-17 19:22:53,318     130.487(s)
hs_10005_p   2007-01-17 19:22:53,318     253.035(s)
hs_10006_m   2007-01-17 19:22:53,318     248.548(s)
hs_10006_p   2007-01-17 19:25:23,367    3146.827(s)      

輸出樣例#:

hs_10003_m   2007-01-17 19:22:53,318     126.622(s)
hs_10002_m   2007-01-17 19:22:53,315     129.574(s)
hs_10005_m   2007-01-17 19:22:53,318     130.487(s)
hs_10003_p   2007-01-17 19:22:53,318     136.962(s)
hs_10006_m   2007-01-17 19:22:53,318     248.548(s)
hs_10000_p   2007-01-17 19:22:53,315     253.035(s)
hs_10005_p   2007-01-17 19:22:53,318     253.035(s)
hs_10001_p   2007-01-17 19:22:53,315     253.846(s)
hs_10002_p   2007-01-17 19:22:53,315     262.531(s)
hs_10006_p   2007-01-17 19:25:23
      
#include <bits/stdc++.h>
using namespace std;

struct Task{
	char allLog[200];
	char name[12];
	char start_day[15];
	char start_time[15];
	char wastetime[15];
}tasks[1005];

bool cmp(Task a,Task b){
	int len1 = strlen( a.wastetime);
	int len2 = strlen( b.wastetime);
	if (len1!=len2) 	{return len1 < len1;
	}
	else {
		int x = strcmp(a.wastetime,b.wastetime);
		if (x!=0){
		return x<0;
		} 
		else{
		int x = strcmp( a.start_day,b.start_day);
		if (x!=0) {
		return x<0;}
		else{
		return strcmp( a.start_time,b.start_time)<0;
		} 
   }
 }
}

int main(){
	int n = 0;

		while(gets(tasks[n].allLog))
		{		
			sscanf(tasks[n].allLog,"%s%s%s%s",tasks[n].name,tasks[n].start_day,tasks[n].start_time,tasks[n].wastetime);
			n++;
		}

		sort(tasks,tasks+n,cmp);
		
		for(int i = 0;i<n;i++){
			cout<<tasks[i].allLog<<endl;
		}
	return 0;
}
           

整數奇偶排序2.0

題目描述

輸入10個整數,彼此以空格分隔。重新排序以後輸出(也按空格分隔),要求: 1.先輸出其中的奇數,并按從大到小排列; 2.然後輸出其中的偶數,并按從小到大排列。

輸入描述:

任意排序的10個整數(0~100),彼此以空格分隔。      

輸出描述:

可能有多組測試資料,對于每組資料,按照要求排序後輸出,由空格分隔。

1. 測試資料可能有很多組,請使用while(cin>>a[0]>>a[1]>>...>>a[9])類似的做法來實作;
2. 輸入資料随機,有可能相等。
      

輸入樣例#:

4 7 3 13 11 12 0 47 34 98      

輸出樣例#:

47 13 11 7 3 0 4 12 34 98      
#include <bits/stdc++.h>
using namespace std;

bool cmp(int a,int b){
	//兩個數都是奇數 
	if(a%2 &&b%2) {
	return a>b;
	}
	//兩個都為偶數 
	else if(a%2==0 &&b%2==0) {
	return a<b;
	}
	else return (a%2) > (b%2) ;
}

int main(){
	int a[10] ;
	while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]){
	    sort(a,a+10,cmp);
		for (int i = 0;i<10;i++){	
		cout<<a[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}
           

字元串排序

題目描述

 輸入一個長度不超過20的字元串,對所輸入的字元串,按照ASCII碼的大小從小到大進行排序,請輸出排序後的結果

輸入描述:

一個字元串,其長度n<=20      

輸出描述:

輸入樣例可能有多組,對于每組測試樣例,
按照ASCII碼的大小對輸入的字元串從小到大進行排序,輸出排序後的結果
      

輸入樣例#:

dcba      

輸出樣例#:

abcd      

解一 

#include <bits/stdc++.h>
using namespace std;

int main(){
	string s;
	cin>>s;
	sort(s.begin(),s.end());
	cout<<s<<endl;
	return 0;
}
           

解二 

#include <bits/stdc++.h>
using namespace std;

int main(){
	char s[20];
	scanf("%s",&s);
	int len = strlen(s);
	sort(s,s+len);
	printf("%s",s);
	return 0;
}
           

字元串排序3

題目描述

先輸入你要輸入的字元串的個數。然後換行輸入該組字元串。每個字元串以回車結束,每個字元串少于一百個字元。 如果在輸入過程中輸入的一個字元串為“stop”,也結束輸入。 然後将這輸入的該組字元串按每個字元串的長度,由小到大排序,按排序結果輸出字元串。

輸入描述:

字元串的個數,以及該組字元串。每個字元串以‘\n’結束。如果輸入字元串為“stop”,也結束輸入.      

輸出描述:

可能有多組測試資料,對于每組資料,
将輸入的所有字元串按長度由小到大排序輸出(如果有“stop”,不輸出“stop”)。

根據輸入的字元串個數來動态配置設定存儲空間(采用new()函數)。每個字元串會少于100個字元。
測試資料有多組,注意使用while()循環輸入。
      

輸入樣例#:

5
sky is grey
cold
very cold
stop
3
it is good enough to be proud of
good
it is quite good      

輸出樣例#:

cold
very cold
sky is grey
good
it is quite good
it is good enough to be proud of
      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

bool cmp(string a,string b){
	return  a.length() <b.length() ;
}

int main(){
	int n;
	while(cin>>n)
	{	
		getchar();//接收cin完的空格
		string a[n];
		for(int i;i<n;i++)
		{
			string s;
			getline(cin,s);
			if(s==" ")
			{
				i--;//遇到空格退回空格前面的字元
				continue;
			}
			if(s == "stop")
			{
				n = i;//停止輸入,i比n小1
				break;
			}
			else   a[i] = s;
		}
		sort(a,a+n,cmp);
		for(int i = 0;i<n;i++)
			cout<<a[i]<<endl;
	}
	return 0;
}
           

字尾子串排序

題目描述

對于一個字元串,将其字尾子串進行排序,例如grain 其子串有: grain rain ain in n 然後對各子串按字典順序排序,即: ain,grain,in,n,rain

輸入描述:

多組資料輸入。
每個案例為一行字元串。      

輸出描述:

将子串排序輸出
      

輸入樣例#:

grain      

輸出樣例#:

ain
grain
in
n
rain      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

bool cmp(string a,string b){
	return  a < b;
}
int main(){
	string s;
	string s2[1005];
	
	while(cin>>s){
		int len = s.size();
		for (int i = 0;i<len;i++){
			string a = s.substr(i,len-i);
			s2[i] = a;
		}
		sort(s2,s2+len,cmp);
		for(int i = 0;i<len;i++)
		cout<<s2[i]<<endl;
	}
	return 0;
}
           

EXCEL排序

題目描述

Excel可以對一組紀錄按任意指定列排序。現請你編寫程式實作類似功能。     對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編号(從1開始)。随後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學号遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 時,按成績的非遞減排序。當若幹學生具有相同姓名或者相同成績時,則按他們的學号遞增排序。

輸入描述:

測試輸入包含若幹測試用例。每個測試用例的第1行包含兩個整數 N (N<=100000) 和 C,其中 N 是紀錄的條數,C 是指定排序的列号。以下有N行,每行包含一條學生紀錄。每條學生紀錄由學号(6位數字,同組測試中沒有重複的學号)、姓名(不超過8位且不包含空格的字元串)、成績(閉區間[0, 100]内的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。      

輸出描述:

對每個測試用例,首先輸出1行“Case:”。随後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學号遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 
時,按成績的非遞減排序。當若幹學生具有相同姓名或者相同成績時,則按他們的學号遞增排序。
      

輸入樣例#:

3 1
000007 James 85
000010 Amy 90
000001 Zoe 60      

輸出樣例#:

Case:
000001 Zoe 60
000007 James 85
000010 Amy 90      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

struct student{
	char name[10];
	char id[10];
	int grade;
}stu[20000];

bool cmp1(student a,student b){
	return strcmp(a.id,b.id)<0;
}

bool cmp2(student a,student b){
	if(strcmp(a.name,b.name)==0) 
		return strcmp(a.id,b.id)<0;
	else 
		return strcmp(a.name,b.name)<0;
}

bool cmp3(student a,student b){
		if(a.grade==b.grade) 
			return strcmp(a.id,b.id)<0;
	    else 
			return a.grade<b.grade;
}



int main(){
	int n,C;
	cin>>n>>C;
		for(int i= 0;i<n;i++){
		getchar();
			cin>>stu[i].id>>stu[i].name>>stu[i].grade;
		}
			
		switch(C){
			case 1:
				stable_sort(stu,stu + n,cmp1);
				break;
			case 2:
				stable_sort(stu,stu + n,cmp2);
				break;
			case 3:
				stable_sort(stu,stu + n,cmp3);
				break;
			default:
				break;
				}
		    cout<<"Case:"<<endl; 
			for (int i = 0;i<n;i++)
				
			    cout << stu[i].id<<" "<<stu[i].name<<" "<<stu[i].grade<<endl;
		return 0;
}


           

特殊排序

題目描述

輸入一系列整數,将其中最大的數挑出(如果有多個,則挑出一個即可),并将剩下的數進行排序,如果無剩餘的數,則輸出-1。

輸入描述:

輸入第一行包括1個整數N,1<=N<=1000,代表輸入資料的個數。
接下來的一行有N個整數。      

輸出描述:

可能有多組測試資料,對于每組資料,
第一行輸出一個整數,代表N個整數中的最大值,并将此值從數組中去除,将剩下的數進行排序。
第二行将排序的結果輸出。
      

輸入樣例#:

4
1 3 4 2      

輸出樣例#:

4
1 2 3
      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

int main(){
	int n;
	int a[1009];
	while(cin>>n){
		for (int i= 0;i<n;i++) 
			cin>>a[i];
			
		sort(a,a+n);
		
		cout<<a[n-1]<<endl;//輸出最大值 
		
		for (int i= 0;i<n-1;i++) //對去掉最大值剩下的數進行排序 
			cout<<a[i]<<" ";
			cout<<endl;
			
			
	}
	return 0;

	}
	
           

成績排序3.0

題目描述

有N個學生的資料,将學生資料按成績從低到高排序,如果成績相同則按姓名字元的字典序排序,如果姓名的字典序也相同則按照學生的年齡從小到大排序,并輸出N個學生排序後的資訊。

輸入描述:

測試資料有多組,每組輸入第一行有一個整數N(N<=1000),接下來的N行包括N個學生的資料。
每個學生的資料包括姓名(長度不超過100的字元串)、年齡(整形數)、成績(小于等于100的正數)。      

輸出描述:

将學生資訊按成績進行排序,成績相同的則按姓名的字母序進行排序。
然後輸出學生資訊,按照如下格式:
姓名 年齡 成績

學生姓名的字母序區分字母的大小寫,如A要比a的字母序靠前(因為A的ASC碼比a的ASC碼要小)。
      

輸入樣例#:

3
abc 20 99
bcd 19 97
bed 20 97      

輸出樣例#:

bcd 19 97
bed 20 97
abc 20 99
      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

struct student{
	int grade;
	char name[100];
	int age;
}stu[1000];

bool cmp(student a,student b){
	if (a.grade==b.grade) return strcmp(a.name,b.name)<0;
	else if(strcmp(a.name,b.name)==0) return a.age<b.age;
	else return a.grade <b.grade;
}

int main(){
	int n;
	while(cin>>n){
		for(int i = 0;i<n;i++)
			cin>>stu[i].name>>stu[i].age>>stu[i].grade;
			
		sort(stu,stu + n,cmp);
		for(int i = 0;i<n;i++)
			cout<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].grade<<endl;
	}
	return 0;
}
           

大整數排序

題目描述

對N個長度最長可達到1000的數進行排序。

輸入描述:

輸入第一行為一個整數N,(1<=N<=100)。
接下來的N行每行有一個數,數的長度範圍為1<=len<=1000。
每個數都是一個正數,并且保證不包含字首零。      

輸出描述:

可能有多組測試資料,對于每組資料,将給出的N個數從小到大進行排序,輸出排序後的結果,每個數占一行。
      

輸入樣例#:

3
11111111111111111111111111111
2222222222222222222222222222222222
33333333      

輸出樣例#:

33333333
11111111111111111111111111111
222222222222222222222222222222      
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 

bool cmp(string a,string b){
	if (a.length()==b.length())
		return a<b;
	else return  a.length() < b.length();
}

int main(){
	int n;
	string s[1005];
	while(cin>>n){
		for(int i = 0;i<n;i++)
			cin>>s[i];
			sort(s,s+n,cmp);

		for (int i = 0;i<n;i++)
			cout<<s[i]<<endl;
	}
	return 0;
}
           

繼續閱讀