C++ 排序函數 sort(),qsort()的用法

?想起來自己天天排序排序,冒泡啊,二分查找啊,結果在STL中就自帶了排序函數sort,qsort,總算把自己解脫了~

所以自己總結了一下,首先看sort函數見下表:

???

函數名功能描述
sort對給定區間所有元素進行排序
stable_sort對給定區間所有元素進行穩定排序
partial_sort對給定區間所有元素部分排序
partial_sort_copy對給定區間復制并排序
nth_element找出給定區間的某個位置對應的元素
is_sorted判斷一個區間是否已經排好序
partition使得符合某個條件的元素放在前面
stable_partition相對穩定的使得符合某個條件的元素放在前面

?

要使用此函數只需用#include <algorithm> sort即可使用,語法描述為:

sort(begin,end),表示一個范圍,例如:

int _tmain(int argc, _TCHAR* argv[])
{
?int a[20]={2,4,1,23,5,76,0,43,24,65},i;
?for(i=0;i<20;i++)
??cout<<a[i]<<endl;
?sort(a,a+20);
?for(i=0;i<20;i++)
?cout<<a[i]<<endl;
?return 0;
}

輸出結果將是把數組a按升序排序,說到這里可能就有人會問怎么樣用它降序排列呢?這就是下一個討論的內容.

?

一種是自己編寫一個比較函數來實現,接著調用三個參數的sort:sort(begin,end,compare)就成了。對于list容器,這個方法也適用,把compare作為sort的參數就可以了,即:sort(compare).

1)自己編寫compare函數:

bool compare(int a,int b)
{
???? ?return a<b;?? //升序排列,如果改為return a>b,則為降序

}

int _tmain(int argc, _TCHAR* argv[])
{
???? int a[20]={2,4,1,23,5,76,0,43,24,65},i;
??? ?for(i=0;i<20;i++)
???? ??cout<<a[i]<<endl;
?? ? sort(a,a+20,compare);
??? ?for(i=0;i<20;i++)
?????? cout<<a[i]<<endl;
??? ?return 0;
}

2)更進一步,讓這種操作更加能適應變化。也就是說,能給比較函數一個參數,用來指示是按升序還是按降序排,這回輪到函數對象出場了。

為了描述方便,我先定義一個枚舉類型EnumComp用來表示升序和降序。很簡單:

enum Enumcomp{ASC,DESC};

然后開始用一個類來描述這個函數對象。它會根據它的參數來決定是采用“<”還是“>”。

class compare
{
????? private:
??????????? Enumcomp comp;
????? public:
?????????? ?compare(Enumcomp c):comp(c) {};
???? ?bool operator () (int num1,int num2)?
??????? ?{
??????????? switch(comp)
????????????? {
???????????????? case ASC:
????????????????????? ? return num1<num2;
?????????????? ? case DESC:
??????????????????? ??? return num1>num2;
?????????? ?? }
??????? ? }
};

接下來使用 sort(begin,end,compare(ASC)實現升序,sort(begin,end,compare(DESC)實現降序。

主函數為:

int main()
{
???? int a[20]={2,4,1,23,5,76,0,43,24,65},i;
???? for(i=0;i<20;i++)
???????? cout<<a[i]<<endl;
???? sort(a,a+20,compare(DESC));
??? ?for(i=0;i<20;i++)
?????????cout<<a[i]<<endl;
?????return 0;
}

3)其實對于這么簡單的任務(類型支持“<”、“>”等比較運算符),完全沒必要自己寫一個類出來。標準庫里已經有現成的了,就在functional里,include進來就行了。functional提供了一堆基于模板的比較函數對象。它們是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。對于這個問題來說,greater和less就足夠了,直接拿過來用:

  • 升序:sort(begin,end,less<data-type>());
  • 降序:sort(begin,end,greater<data-type>()).

int _tmain(int argc, _TCHAR* argv[])
{
???? ?int a[20]={2,4,1,23,5,76,0,43,24,65},i;
???? ?for(i=0;i<20;i++)
??????? ??cout<<a[i]<<endl;
???? ?sort(a,a+20,greater<int>());
???? ?for(i=0;i<20;i++)
???????? ?cout<<a[i]<<endl;
???? ?return 0;
}

4)既然有迭代器,如果是string 就可以使用反向迭代器來完成逆序排列,程序如下:

int main()
{
?? ? string str("cvicses");
??? ?string s(str.rbegin(),str.rend());
??? ?cout << s <<endl;
??? ?return 0;
}

?

?

qsort():

原型:
_CRTIMP void __cdecl?qsort?(void*, size_t, size_t,int (*)(const void*, const void*));

解釋:??? qsort ( 數組名 ,元素個數,元素占用的空間(sizeof),比較函數)?
比較函數是一個自己寫的函數? 遵循 int com(const void *a,const void *b) 的格式。
當a b關系為 >? <? = 時,分別返回正值 負值 零 (或者相反)。
使用a b 時要強制轉換類型,從void * 轉換回應有的類型后,進行操作。?
數組下標從零開始,個數為N, 下標0-(n-1)。

實例:
int compare(const void *a,const void *b)
{
???? return *(int*)b-*(int*)a;???
}

int main()
{
???? int a[20]={2,4,1,23,5,76,0,43,24,65},i;
???? for(i=0;i<20;i++)
?????? ?cout<<a[i]<<endl;
???? qsort((void *)a,20,sizeof(int),compare);
??? ?for(i=0;i<20;i++)
?????? ?cout<<a[i]<<endl;
??? ?return 0;
}

相關:

1)why你必須給予元素個數?

因為陣列不知道它自己有多少個元素

2)why你必須給予大小?

因為?qsort?不知道它要排序的單位.

3)why你必須寫那個丑陋的、用來比較倆數值的函式?

因為?qsort?需要一個指標指向某個函式,因為它不知道它所要排序的元素型別.

4)why?qsort?所使用的比較函式接受的是?const void*?引數而不是?char*?引數?

因為?qsort?可以對非字串的數值排序.

轉自:https://blog.csdn.net/zzzmmmkkk/article/details/4266888?

轉載于:https://www.cnblogs.com/dylancao/p/9150447.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.net core 實現默認圖片

web 上 如果圖片不存在 一般是打xx 這時候 一般都是會設置默認的圖片 代替 現在用中間件的方式實現統一設置 一次設置 全部作用 .net core 實現默認圖片 Startup 文件 app.UseDefaultImage(defaultImagePath: Configuration.GetSection("defaultImagePath").Va…

spring cloud config將配置存儲在數據庫中

轉載請標明出處&#xff1a; https://blog.csdn.net/forezp/...本文出自方志朋的博客 Spring Cloud Config Server最常見是將配置文件放在本地或者遠程Git倉庫&#xff0c;放在本地是將將所有的配置文件統一寫在Config Server工程目錄下&#xff0c;如果需要修改配置&#xff0…

VMware虛擬機VMware Authorization Service不能啟動問題

出現VMware Authorization Service不能啟動問題&#xff0c;注意要在安裝VMware Player時使用管理員權限轉載于:https://www.cnblogs.com/mingzhang/p/9152873.html

PHP替換回車換行的三種方法

一個小小的換行&#xff0c;其實在不同的平臺有著不同的實現&#xff0c;為什么要這樣&#xff0c;世界是多樣的&#xff01;本來在Unix世界換行用/n來代替換行&#xff0c;Windows為了體現不同&#xff0c;就用/r/n&#xff0c;更有意思的是&#xff0c;Mac中又用了/r。所以&a…

全球的weex資源都在這里

WeeX FAQ QQ: Weex大前端 516682889Weexbox&#xff1a; 943913583WeeX相關資源 weex官方資源 weex官網 Weex Market 已掛 : 一個提供 Weex 第三方組件的網站&#xff0c;您可以在這里找到你需要的 Weex 組件。 Playground : Playground在線&#xff0c;直接在線編寫代碼并預覽…

初步解決博客園代碼高亮的一個方案

今天我要推薦的是一個免費而且支持markdown語法的軟件——Typora 它有很多優點&#xff0c;支持多種類型代碼的高亮風格&#xff0c;方便的排版處理&#xff0c;支持Latex等&#xff0c;最重要的一點是真正做到了所見即所得ヽ(&#xff9f;?&#xff9f;)&#xff92;(&#x…

git工作原理

工作區&#xff1a;就是你在電腦里能看到的目錄。暫存區&#xff1a;英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我們把暫存區有時也叫作索引&#xff08;index&#xff09;。版本庫&#xf…

【前端基礎進階】JS-Object 功能詳解

Object.assign(target,source1,source2,...)該方法主要用于對象的合并&#xff0c;將源對象source的所有可枚舉屬性合并到目標對象target上,此方法只拷貝源對象的自身屬性&#xff0c;不拷貝繼承的屬性。Object.assign方法實行的是淺拷貝&#xff0c;而不是深拷貝。也就是說&am…

解決“無法從套接字讀取更多數據”

重啟下Oralce服務即可。轉載于:https://www.cnblogs.com/fkeyta/p/9153297.html

網頁下載Google Play 的App

網頁下載Google Play 的App 文章目錄[點擊展開](?)[] 前言 當你想在google play上下載某個應用&#xff0c;而無奈手機的系統并沒有安裝google servicess&#xff0c;此刻是否有些捉急&#xff1f; 本文分享的是一個網站&#xff0c;它可以無需手機而直接通過網頁下載Google P…

“硬核”代碼重構

在學習編程的路上&#xff0c;相信大家這幾個詞一定不少聽&#xff0c;什么 面相對象、封裝繼承多態、內功心法21種設計模式 等等 。但是卻很少用到&#xff0c;或者說用到的都是被動使用。大牛們在寫代碼前早就構思好了&#xff0c;接口&#xff0c;基類等等。自己寫代碼的時候…

上傳jar包到nexus私服

進入maven管理頁面&#xff0c;登錄管理員賬號 完成后可以進入對應目錄下查看pom依賴 通過maven的方式depoly 在maven的conf/setting.xml 配置nexus私服的管理賬號 在servers標簽下添加server <server><id>nexus-snapshots</id><username>repouser<…

手把手教你寫高質量Android技術博客,畫圖工具,錄像工具,Markdown寫法

前言 作為程序員&#xff0c;寫博客是一件很有意義的事情&#xff0c;可以加深自己對技術的理解&#xff0c;可以結交更多的朋友&#xff0c;記錄自己的技術軌跡&#xff0c;而且分享可以讓更多的人從中受益&#xff0c;獨樂樂不如眾樂樂嘛。 但是要寫好博客也不是件容易的事&a…

【Android】RxJava的使用(四)線程控制 —— Scheduler

前言 經過前幾篇的介紹&#xff0c;對RxJava對模式有了一定的理解&#xff1a;由Observable發起事件&#xff0c;經過中間的處理后由Observer消費。&#xff08;對RxJava還不了解的可以出門左拐&#xff09;之前的代碼中&#xff0c;事件的發起和消費都是在同一個線程中執行&am…

sed: -e expression #1, unknown option to `s'解決辦法

報錯如下&#xff1a; sed: -e expression #1, char 13: unknown option to s 需要替換的行為&#xff1a; monitor.urlhttp://192.168.25.100:8443/rest 查詢資料得知&#xff0c;報錯是因為替換的字符串包含有分隔符/ 所以這行改一下分隔符就可以解決問題了 改成感嘆號!或者|…

Linux常用開發環境軟件-Redis安裝(docker環境下)

linux&#xff0c;docker安裝RabbitMQ版本 1、從docker官網倉庫下載安裝RabbitMQ鏡像 官網地址&#xff1a;https://hub.docker.com/ docker pull redis:4.0.8  //后面是版本,Tag Name 2、啟動Docker Redis鏡像 docker run -d -p 6379:6379 redis:4.0.8  啟動鏡像&#xff…

以當天日期時間,打包目錄

#備份/data目錄#!/bin/bash DATEdate %Y-%m-%d-%H:%M:%S tar cvf /mnt/resource/script/prod_master_data.$DATE.tar.gz /data[root111 script]# ll total 2536 -rw-r--r-- 1 root root 2590720 Feb 22 21:46 prod_master_data.2019-02-22-21:46:53.tar.gz轉載于:https://blog.…

lvs+keepalived詳解

常用軟件安裝及使用目錄 資源鏈接&#xff1a;https://pan.baidu.com/s/15rFjO-EnTOyiTM7YRkbxuA 網盤分享的文件在此 官網&#xff1a;http://www.linuxvirtualserver.org/index.html 中文資料 LVS項目介紹 http://www.linuxvirtualserver.org/zh/lvs1.html …

微信自動打卡

要有第二臺安卓 手機&#xff0c;打開usb、adb調試&#xff0c;永不鎖屏&#xff0c;永不休眠&#xff0c;手機安裝了微信并至少成功登陸過一次&#xff0c; 一臺不關機的電腦&#xff0c;手機連接電腦&#xff0c;Appium服務器保持啟動&#xff0c;在開始菜單 設定好任務計劃程…

利用反射做類參數的校驗

需求描述 業務需求描述&#xff1a;對webservice接口參數校驗 代碼實現 /*** 字符串長度校驗* * param str* param len* return 合法(true),不合法(false)*/public static boolean check(String str, int len) {if (null ! str && str.length() > len) {return fals…