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

2021-07-12 17:33:46 字數 4428 閱讀 3250

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.

包含在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個元素,只需要

在第一個和第二個引數上進行一些修改

** 標程,舉例說明 **

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語言資料結構 快速排序的問題

將 放在變數名後,是先使用變數的值,再執行自加 自減 開始時i為左邊界,j為右邊界 以x s i 為中回間答值,將小於x的值放在左邊,大於x的值放在右邊找到大於x的值將其放在s j 中,j j 1,找到小於x的值將其放在s i 中,i i 1,直到所有數值按兩邊放好。依次在區間n,n 2,n 4,2...

資料結構C語言氣泡排序問題

修改 for j n 1 j i j e69da5e887aa62616964757a686964616f31333330343162 if r j 1 key key 瞭解一下氣泡排序 bubblesort 的基本概念 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個...

C語言結構體陣列的初始化,C語言結構陣列初始化的問題

定義成struct list 試試呢?struct list creat char name,int priority,int time 同學,你注意到了create 函式裡面,你又定義了一句 list pr 了麼?這句話時關鍵,首先,你在main 函式 我猜應該是main吧 中寫道 list pr...