C語言關於結構體排序要用qsort

2021-07-12 17:33:47 字數 4428 閱讀 1141

1樓:匿名使用者

排序方法有很多種, 選擇排序,氣泡排序,歸併排序,快速排序等。

看名字都知道快速排序 是目前公認的一種比較好的排序演算法(我沒聽書速度比這快的了,特殊場合例外),比選擇排序,氣泡排序都要快。這是因為他速度很快,所以系統也在庫裡實現這個演算法,便於我們的使用。

這就是qsort。

qsort 要求提供一個 比較函式,是為了做到通用性更好一點。比如你不僅僅的是要排序一個數字而已,可能你要用來排序幾個數字 ,比如有一個結構

struct num ;

然後我有一個num 型別的陣列, num dddd[100];

我想給 dddd這個陣列排序,那怎麼辦? 我想讓 a +b 最大的num元素排在陣列的最前面,那又怎麼辦?

這都可以通過定義比較函式來做到的。

比較函式的作用就是給qsort指明 元素的大小是怎麼比較的。

像這樣的比較函式 inline int mycmp(const void* a, const void* b)

都是有兩個元素 作為引數,返回一個int 值, 如果 比較函式返回大於0,qsort就認為 a>b , 如果比較函式返回等於0 qsort就認為a 和b 這兩個元素相等,返回小於零 qsort就認為 a

qsort 知道元素大小,就可以把大的放到前面去。

如果你的比較函式放回本來應該是1 的(a>b),你比較函式卻返回一個 -1 (小於零的)那麼qsort認為a

同樣的道理,如果有一個 結構

strunt 人

你想讓身高最小的人排在最前面,那麼你也要自己定義自己的比較函式 ,

2樓:匿名使用者

我執行了好像沒問題,可能是編譯器的問題

3樓:童美芳

(13):error c2065: 'student' : undeclared identifier

compare1的函式修改如下:

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

4樓:匿名使用者

這個 ,,,,我不太會啊

求解析c語言中qsort()有關結構體快排

5樓:匿名使用者

#include

#include

#include

struct samples[5]=,,,,};

int cmpsample( const void* p1, const void* p2 )

int main()

return 0;}

關於c語言中qsort函式的用法?

6樓:匿名使用者

引自 http://hi.baidu.

com/sysucs/blog/item/4f9962f422d2c2ddf2d385fd.html qsort,包含在stdlib.h標頭檔案裡,函式

一共四個引數,沒返回值.一個典型的qsort的寫法如下

qsort(s,n,sizeof(s[0]),cmp);

其中第一個引數是參與排序的陣列名(或者也可以理解成開始排序的地址,因為可以寫&s[i]

這樣的表示式,這個問題下面有說明); 第二個引數是參與排序的元素個數; 第三個三數是

單個元素的大小,推薦使用sizeof(s[0])這樣的表示式,下面也有說明 :) ;第四個引數就是

很多人覺得非常困惑的比較函式啦,關於這個函式,還要說的比較麻煩...

我們來討論cmp這個比較函式(寫成cmp是我的個人喜好,你可以隨便寫成什麼,比如qcmp什麼

的).典型的cmp的定義是

int cmp(const void *a,const void *b);

返回值必須是int,兩個引數的型別必須都是const void *,那個a,b是我隨便寫的,個人喜好.

假設是對int排序的話,如果是升序,那麼就是如果a比b大返回一個正值,小則負值,相等返回

0,其他的依次類推,後面有例子來說明對不同的型別如何進行排序.

在函式體內要對a,b進行強制型別轉換後才能得到正確的返回值,不同的型別有不同的處理

方法.具體情況請參考後面的例子.

** 關於快排的一些小問題 **

1.快排是不穩定的,這個不穩定一個表現在其使用的時間是不確定的,最好情況(o(n))和最

壞情況(o(n^2))差距太大,我們一般說的o(nlog(n))都是指的是其平均時間.

2.快排是不穩定的,這個不穩定表現在如果相同的比較元素,可能順序不一樣,假設我們有

這樣一個序列,3,3,3,但是這三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定

就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(no.6的例子就

是說明這個問題的)

3.快排的比較函式的兩個引數必須都是const void *的,這個要特別注意,寫a和b只是我的

個人喜好,寫成cmp也只是我的個人喜好.推薦在cmp裡面重新定義兩個指標來強制型別轉換,

特別是在對結構體進行排序的時候

4.快排qsort的第三個引數,那個sizeof,推薦是使用sizeof(s[0])這樣,特別是對結構體,

往往自己定義2*sizeof(int)這樣的會出問題,用sizeof(s[0)既方便又保險

5.如果要對陣列進行部分排序,比如對一個s[n]的陣列排列其從s[i]開始的m個元素,只需要

在第一個和第二個引數上進行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);

** 標程,舉例說明 **

no.1.手工實現quicksort

#include

int a[100],n,temp;

void quicksort(int h,int t)

a[mid]=a[j];

a[j]=x;

quicksort(h,j-1);

quicksort(j+1,t);

return;

}int main()

int main()

int main()

int main()

no.5.對結構體排序

註釋一下.很多時候我們都會對結構體排序,比如校賽預選賽的那個櫻花,一般這個時候都在

cmp函式裡面先強制轉換了型別,不要在return裡面轉,我也說不清為什麼,但是這樣程式會

更清晰,並且絕對是沒錯的. 這裡同樣請注意double返回0的問題

#include

#include

struct node

s[100];

int i,n;

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

int main()

s[100];

int i,n;

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

int main()

int main()

int main()

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i

return(0);}

7樓:匿名使用者

排序方法有很多種, 選擇排序,氣泡排序,歸併排序,快速排序等。

看名字都知道快速排序 是目前公認的一種比較好的排序演算法(我沒聽書速度比這快的了,特殊場合例外),比選擇排序,氣泡排序都要快。這是因為他速度很快,所以系統也在庫裡實現這個演算法,便於我們的使用。

這就是qsort。

qsort 要求提供一個 比較函式,是為了做到通用性更好一點。比如你不僅僅的是要排序一個數字而已,可能你要用來排序幾個數字 ,比如有一個結構

struct num ;

然後我有一個num 型別的陣列, num dddd[100];

我想給 dddd這個陣列排序,那怎麼辦? 我想讓 a +b 最大的num元素排在陣列的最前面,那又怎麼辦?

這都可以通過定義比較函式來做到的。

比較函式的作用就是給qsort指明 元素的大小是怎麼比較的。

像這樣的比較函式 inline int mycmp(const void* a, const void* b)

都是有兩個元素 作為引數,返回一個int 值, 如果 比較函式返回大於0,qsort就認為 a>b , 如果比較函式返回等於0 qsort就認為a 和b 這兩個元素相等,返回小於零 qsort就認為 a

qsort 知道元素大小,就可以把大的放到前面去。

如果你的比較函式放回本來應該是1 的(a>b),你比較函式卻返回一個 -1 (小於零的)那麼qsort認為a

同樣的道理,如果有一個 結構

strunt 人

你想讓身高最小的人排在最前面,那麼你也要自己定義自己的比較函式

c語言定義結構體變數,C語言 定義結構體變數

樂跑小子 首先,定義一個結構的一般形式為 struct結構名 成員表由若干個成員組成,每個成員都是該結構的一個組成部分。對每個成員也必須作型別說明,其形式為 型別說明符 成員名 成員名的命名應符合識別符號的書寫規定。例如 struct stu 在這個結構定義中,結構名為stu,該結構由4個成員組成。...

C語言結構體選單問題,C語言結構體實現多級選單的困惑,請高手解答

首先struct menuitem menupoint main menu 1f 這沒錯,但一般不會這麼用,加括號只是在必要時,如定義行指標獲函式指標時 typedef重定義型別更好 至於為什麼會出現error c230 menuitem unknown struct union enum tag ...

c語言結構體定義了,C語言結構體 定義了typedef struct int key element 能否在main函式裡定義element x

bai。太強大了。翻譯過du來是這樣zhi的。定義 型別dao 型別名。簡單說。int是整型內。容那element 就相當於int a中的a,struct相當於int。理解麼?不理解。換個,陣列名。就是element,陣列就是 struct key就是陣列裡面的 i。這樣該懂了吧。沒有名稱的結構體就...