1. 程式人生 > >結構體排序

結構體排序

tools 區別 ostream lai crt view tails sin 範圍

結構體排序和普通的整型實型數據排序的區別在於缺少比較規則需要人為的給出,我們可以通過重載<,>,<=,>=等比較運算符或者寫一個比較函數,然後就像處理一般變量一樣完成排序。

這裏為了方便使用sort函數進行排序而不手寫排序函數,sort函數是C++自帶的排序函數,包含於頭文件<algorithm>,函數的參數是數組的首地址和結束地址和比較函數,比較函數帶有默認函數參數,默認調用 < 運算符,能直接對普通的基本數組進行由小到大排序,如果我們要利用sort函數來對結構體進行排序,我們必須手寫一個比較函數來確定比較規則,或者重載<運算符,比如說我們有一個存放漢字的結構體,結構體中有存放筆畫順序的編號和拼音順序的編號,如果我們要按照筆畫順序排序,我們的比較函數就比較的是筆畫編號。

bool cmp(漢字 a , 漢字 b) 或者 bool operator < (漢字 a , 漢字 b)

{

return a.筆畫編號<b.筆畫編號;

}

這樣就能將漢字按照筆畫順序進行升序排序,如果是要降序排序的話把小於號改為大於就行。

比較的規則可以根據自己實際需求來確定,可以多個比較來確定最終返回值,只要保證返回值是確定的true或者false就行

調用sort函數進行排序時這樣寫:

sort(A,A+1000,cmp) 或者重載<運算符後 sort(A,A+1000);

註意這裏是加的1000而不是999,你可以將函數參數理解為一段連續區間,左閉右開,這樣才能將整個排序數組所占的內存全部包含進去。

數組名A是數組首地址,A+1000是地址運算得到的是整個數組存放的內存的結束末尾,cmp是我們寫的比較函數,同時也重載了<運算符。

完整的代碼演示:

[cpp] view plain copy
  1. #define _CRT_RAND_S
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. using namespace std;
  6. int Rand(int MinNum, int MaxNum) { //生成範圍可控的隨機數的函數
  7. unsigned int TempData;
  8. rand_s(&TempData);
  9. int result = ((double)TempData / (double)UINT_MAX)*(double)(MaxNum - MinNum + 1);
  10. return result + MinNum;
  11. }
  12. struct date {
  13. int year;
  14. int month;
  15. int day;
  16. bool operator <(date& a) { //重載雙目比較運算符<,此時結構體自身作為一個實參,另一個由調用時給出,這裏也可以使用引用
  17. if (year != a.year)
  18. return year < a.year;
  19. else if (month != a.month)
  20. return month < a.month;
  21. else
  22. return day < a.day;
  23. }
  24. friend ostream& operator <<(ostream& cout, date& a) //重載輸出用到的<<運算符 {
  25. cout << a.year << ‘-‘ << a.month << ‘-‘ << a.day;
  26. return cout;
  27. }
  28. };
  29. bool cmp(date& a, date& b) {
  30. if (a.year != b.year)
  31. return a.year > b.year;
  32. else if (a.month != b.month)
  33. return a.month > b.month;
  34. else
  35. return a.day > b.day;
  36. }
  37. int main() {
  38. date a[10];
  39. for (int i = 0; i < 10; i++) {
  40. a[i].year = Rand(1000, 2000);
  41. a[i].month = Rand(1, 12);
  42. a[i].day = Rand(1, 30);
  43. }
  44. cout << "ascending:" << endl << endl;
  45. sort(a, a + 10);
  46. for (int i = 0; i < 10; i++)
  47. cout << a[i] << endl;
  48. cout << endl;
  49. cout << "descending:" << endl << endl;
  50. sort(a, a + 10, cmp);
  51. for (int i = 0; i < 10; i++)
  52. cout << a[i] << endl;
  53. return 0;
  54. }

結構體排序