qsort與sort函式中cmp的編寫方法與解析

2021-08-16 17:57:04 字數 2186 閱讀 3751

在使用c/c++語言進行程式設計時,為了方便起見,我們在排序時經常呼叫系統提供的排序函式來完成部分排序功能,本文將介紹qsort與sort函式的用法,尤其是其cmp函式的編寫方法。

c語言中,編譯器函式庫自帶的快速排序函式。

標頭檔案:stdlib.h

qsort 的函式原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

各引數:1 待排序陣列首位址 2 陣列中待排序元素數量 3 各元素的占用空間大小 4 指向函式的指標

舉個例子:

對乙個長為1000的陣列進行公升序排序時,int list[1000]; 那麼base應為list,num應為 1000,width應為 sizeof(int),compare函式隨自己的命名,這裡我們命名為comp。qsort函式寫為qsort(list,1000,sizeof(int),comp),其中comp函式應寫為:

int comp(const void*a,const void*b)

這裡根據下面**表述的compare函式的返回值可以了解到:

1,如果a>b那麼comp函式的返回值》0,那麼a將被排在b後面

2,如果acompare函式的返回值

描述

< 0

elem1將被排在elem2前面

0

elem1 等於 elem2

> 0

elem1 將被排在elem2後面

還有就是為什麼要用如此複雜的*(int*)a來表示list中的乙個數字呢,因為這裡傳入的int comp(const void*a,const void*b)的形參中a為乙個不確定型別的指標,這裡我們首先使用(int *)將a強制轉換為了指向int型別的指標,其次我們要取到乙個指標所指向的內容需要使用*符號,所以就有了*(int*)a這種方法取到了乙個int型別的數字。

在舉乙個複雜點的例子,該例子中需要根據兩個欄位的值來排序:

有這樣乙個包含學生資訊的結構體stuinfo和陣列stus[1000],陣列中的每一項都為乙個stuinfo:

typedef struct studentinfostuinfo;
我們需要首先將陣列中儲存的學生資訊按照學生的班級公升序排序,其次按照學生的gpa來公升序排序。那麼應該怎麼寫compare函式呢

int comp(const void*a,const void*b)

用於c++中,對給定區間所有元素進行排序。

標頭檔案:#include

using namespace std;

函式宣告:

#include template< class randomit >

void sort( randomit first, randomit last );

template< class randomit, class compare >

void sort( randomit first, randomit last, compare comp );

各引數:第乙個引數是待排序元素的首位址,一般寫上陣列首個待排序元素即可。第二個引數是待排序元素的尾位址。最後乙個引數是比較函式的名稱(自定義函式cmp),這個比較函式可以不寫,即第三個引數可以預設,這樣sort會預設按陣列公升序排序。例如需要對num[1000]中的第100號下標到200號下標元素進行公升序排序,我們可以寫為sort(num[100],num[200])。

而如果要實現對num[1000]中的第100號下標到200號下標元素進行降序排序,我們就需要編寫額外的cmp函式了。

compare函式的返回值

描述

true或1

elem1將被排在elem2前面

false或0

elem1將被排在elem2後面

這裡降序排序的cmp函式應寫為如下:

bool compare(int a,int b)

同理針對前文中所述的對於學生資訊結構體的排序,用sort函式來處理的話應該如下書寫cmp函式:

bool compare(stuinfo a,stuinfo b)

{if(a.class!=b.class)return a.class

C 中sort與qsort函式簡介

c 中自帶了一些排序函式,其中stl的sort qsort 用的較多 sort 複雜度為n log2 n 標頭檔案 include 原型 template classrandomaccessiterator voidsort randomaccessiterator first,randomacce...

qsort函式 sort函式

先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用...

qsort函式 sort函式

先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用...