排序題與sort函式的應用

2021-09-26 04:51:15 字數 1284 閱讀 1257

關於結構體陣列型別的排序題~

對於題目中給出了很多個體資訊的排序題,考慮定義結構體存放。如student個體:

struct studentstu[100010];
使用sort排序時,需提供cmp函式實現排序的規則。

例: 在考試的排序題,要求對所有學生先按分數從高到低排序,分數相同的按姓名的字典序從小到大排序。cmp函式如下:

bool cmp(student a,student b)
關於strcmp函式:

strcmp函式是string.h標頭檔案下用來比較兩個char型陣列的字典序大小的,其中strcmp(str1,str2),當str1的字典序小於str2時返回乙個負數,當str1的字典序等於str2時返回0,當str1的字典序大於str2時返回乙個正數。

對於cmp函式裡的strcmp(a.name,b.name)<0,即表示a.name的字典序小於b.name的字典序,那麼 return strcmp(a.name,b.name)<0;也就是表示此時按姓名的字典序從小到大排序。

很多排序題都會要求在排序之後計算出每個個體的排名,並且規則一般是:分數不同的排名不同,分數相同的排名相同(占用乙個排位)。例如有5個學生的分數為95,88,88,88,92,那麼這5個學生的排名是:1,2,2,2,5

對這種要求,一般都要在結構體型別定義時就要把排名這一項加到結構體中,於是在陣列排序完成後就有下面兩種方法來實現排名的計算:

(1)先將陣列第乙個個體(假設陣列下標從0開始)的排名記為1,然後遍歷剩餘個體:如果當前個體的分數等於上乙個個體的分數,那麼當前個體的排名等於上乙個個體的排名,否則,當前個體的排名等於陣列的下標加1。**如下:

stu[0].r=1;

for(int i=0;i(2)而有時題目中不一定需要真的把排名記錄下來,而是直接輸出即可,那麼也可以用這樣的方法:令int型變數r的初值為1,然後遍歷所有個體:如果當前的個體不是第乙個個體且當前個體的分數不等於上乙個個體的分數,那麼令r等於陣列的下標加1,這時r就是當前個體的排名,直接輸出即可。

int r=1;

for(int i=0;i0 && stu[i].score!=stu[i-1].score)

r=i+1;

//輸出當前個體的資訊。或者令stu[i].r=r也行

}

這樣的做法適合於需要輸出的資訊過多,導致第一種方法**冗長的情況。

C 排序函式(sort與qsort)的應用

msdn中的定義 templatevoid sort ranit first,ranit last 1 templatevoid sort ranit first,ranit last,pred pr 2 標頭檔案 include using namespace std 1.預設的sort函式是按公...

sort排序函式

所以自己總結了一下,首先看sort函式見下表 函式名 功能描述 sort 對給定區間所有元素進行排序 stable sort 對給定區間所有元素進行穩定排序 partial sort 對給定區間所有元素部分排序 partial sort copy 對給定區間複製並排序 nth element 找出給...

sort 排序函式

需要標頭檔案 語法描述 sort begin,end,cmp cmp引數可以沒有,如果沒有預設公升序排序。sort函式使用例項 include include includeusing namespace std int main sort a,a 5 for int i 0 i 5 i cout ...