在使用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函式應寫為:
這裡根據下面**表述的compare函式的返回值可以了解到:int comp(const void*a,const void*b)
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函式呢
用於c++中,對給定區間所有元素進行排序。int comp(const void*a,const void*b)
標頭檔案:#include
using namespace std;
函式宣告:
各引數:第乙個引數是待排序元素的首位址,一般寫上陣列首個待排序元素即可。第二個引數是待排序元素的尾位址。最後乙個引數是比較函式的名稱(自定義函式cmp),這個比較函式可以不寫,即第三個引數可以預設,這樣sort會預設按陣列公升序排序。例如需要對num[1000]中的第100號下標到200號下標元素進行公升序排序,我們可以寫為sort(num[100],num[200])。#include template< class randomit >
void sort( randomit first, randomit last );
template< class randomit, class compare >
void sort( randomit first, randomit last, compare comp );
而如果要實現對num[1000]中的第100號下標到200號下標元素進行降序排序,我們就需要編寫額外的cmp函式了。
compare函式的返回值
描述
true或1
elem1將被排在elem2前面
false或0
elem1將被排在elem2後面
這裡降序排序的cmp函式應寫為如下:
同理針對前文中所述的對於學生資訊結構體的排序,用sort函式來處理的話應該如下書寫cmp函式:bool compare(int a,int b)
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函式,使用...