|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 274|回復: 0
打印 上一主題 下一主題

C++ 排序

[複製鏈接]

56

主題

0

好友

475

積分

中學生

Rank: 3Rank: 3

  • TA的每日心情

    2024-3-15 19:20
  • 簽到天數: 191 天

    [LV.7]常住居民III

    推廣值
    0
    貢獻值
    0
    金錢
    179
    威望
    475
    主題
    56
    樓主
    發表於 2014-7-18 20:42:49

     在应用中,如果我们不需要自己来编写排序函数的话,可以通过C/C++中已经实现的库函数来完成排序任务。

    一、sort函数

      sort函数在C++中<algorithm>中,若要使用,需要加上头文件#include <algorithm>,它有如下几种形式:

      (1)默认情况按升序排列:

      假设数组为a[n],下标从0开始,对整个数组按升序排列:

    int a[110], n; //n表示元素个数sort(a, a+n);    //整个数组按升序排列

      (2)若要将某个区间的元素排列,比如需要将第3到第9个元素升序排列:

    sort(a+3, a+10);    //3~9是7个数,注意后面那个数字为什么是10

      (3)如果需要按照降序排列,那么需要写一个cmp比较函数(一般按照升序排列的话,会调用默认的cmp函数:

    bool cmp(int a, int b){    return b < a;    //判断a与b的大小,因为降序,要b-a}

      再使用sort函数:

    sort(a, a+n, cmp); //降序排列,0~n-1

      (4) cmp功能是很强大的,你可以按照任意的方法,任意的组织自己的数组该如何排列:

        下面给个例子:对学生的成绩按降序排列:

    [url=][/url]
    #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;struct student{    char name[20];  //学生姓名    int grade;      //学生分数}ST[100];bool cmp(student a, student b)  //注意这里是bool{    return a.grade > b.grade;   //判断大小,降序}int main(){    int n, gd;    char str[20];    scanf("%d", &n);    //输入学生人数    for(int i = 0; i < n; i++)    {        scanf("%s%d", str, &gd);    //输入学生姓名和成绩        strcpy(ST.name, str);    //存入学生结构体        ST.grade = gd;    }    sort(ST, ST+n, cmp);    for(int i = 0; i < n; i++)        printf("第%d名:%s  %d\n", i+1, ST.name, ST.grade);    return 0;}[url=][/url]

    运行结果:

      sort函数很强大,复杂度O(nlog n),有兴趣的读者还可以自行探讨更多。

    二、qsort函数

      qsort函数,也就是快速排序算法,在C的<stdlib>库中,需加入头文件#include <cstdlib> 或#include <stdlib.h>。

      调用qsort函数需要写cmp比较函数。

      给出按升序排列的例子:

    int cmp(const void* a, const void* b)  //注意这里是int{    return (int*)a - (int*)b;}

      调用:

    qsort(a, n, sizeof(int), cmp);    //a为数组,n为个数

    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-6-1 09:06 , Processed in 0.019063 second(s), 26 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部