日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言标准库函数qsort具体解释

發布時間:2024/8/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言标准库函数qsort具体解释 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1?函數簡單介紹


功 能: 使用高速排序例程進行排序

頭文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的占用空間大小

4 指向函數的指針,用于確定排序的順序

2?基本使用方法


使用qsort()排序并用 bsearch()搜索是一個比較經常使用的組合,使用方便快捷。
qsort 的函數原型是void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))
當中base是排序的一個集合數組,num是這個數組元素的個數,width是一個元素的大小,comp是一個比較函數。
比方:對一個長為1000的數組進行排序時,int a[1000]; 那么base應為a,num應為 1000,width應為 sizeof(int),comp函數隨自己的命名。
qsort(a,1000,sizeof(int),comp);
當中comp函數應寫為:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}qsort上面是由小到大排序,return *(int *)b-*(int *)a; 為由大到小排序。
是對一個二維數組的進行排序:
int a[1000][2]; 當中依照a[0]的大小進行一個總體的排序,當中a[1]必須和a[0]一起移動交換。
qsort(a,1000,sizeof(int)*2,comp);
int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}

qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件里,是依據二分發寫的,其時間復雜度為n*log(n),其結構為:

void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));

當中:

*base 為要排序的數組

nelem 為要排序的數組的長度

width 為數組元素的大小(一字節為單位)

默認是從小到大排序的!

(* Comp)(const void *p1,const void *p2) 為推斷大小函數的指針,這個函數須要自定義,假設p1>p2,函數返回-1;a<b,函數返回1;a==b函數返回0

排序方法有非常多種:選擇排序,冒泡排序,歸并排序,高速排序等。
看名字都知道高速排序 是眼下公認的一種比較好的排序算法(我沒聽說速度比這快的了,特殊場合例外),比選擇排序,冒泡排序都要快。這是由于他速度非???#xff0c;所以系統也在庫里實現這個算法,便于我們的使用。
這就是qsort。

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

struct num

{
int a;
int b;
};

然后我有一個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<b 。

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

假設你的比較函數放回本來應該是1 的(a>b),你比較函數卻返回一個 -1 (小于零的)那么qsort覺得a<b 的,就把 b放到前面去,但實際上是a大于b的,所以就造成升降序的區別了。

3?相關舉例


七種qsort排序方法?

<本文中排序都是採用的從小到大排序>?

一、對int類型數組排序?

int num[100];?

Sample:?

int cmp ( const void *a , const void *b )?
{?
return *(int *)a - *(int *)b; //強制轉換類型
}?

qsort(num,100,sizeof(num[0]),cmp);?

二、對char類型數組排序(同int類型)?

char word[100];?

Sample:?

int cmp( const void *a , const void *b )?
{?
return *(char *)a - *(char *)b;?
}?

qsort(word,100,sizeof(word[0]),cmp);?

三、對double類型數組排序(特別要注意)?

double in[100];?

int cmp( const void *a , const void *b )?
{?
return *(double *)a > *(double *)b ? 1 : -1;?
}?

qsort(in,100,sizeof(in[0]),cmp);?

四、對結構體一級排序?

struct In?
{?
double data;?
int other;?
}s[100];

//依照data的值從小到大將結構體排序,關于結構體內的排序重要數據data的類型能夠非常多種,參考上面的樣例寫?

int cmp( const void *a ,const void *b)?
{?
return (*(In *)a).data > (*(In *)b).data ? 1 : -1;?
}?

qsort(s,100,sizeof(s[0]),cmp);?

五、對結構體二級排序?

struct In?
{?
int x;?
int y;?
}s[100];?

//依照x從小到大排序,當x相等時依照y從大到小排序?

int cmp( const void *a , const void *b )?
{?
struct In *c = (In *)a;?
struct In *d = (In *)b;?
if(c->x != d->x) return c->x - d->x;?
else return d->y - c->y;?
}?

qsort(s,100,sizeof(s[0]),cmp);?

六、對字符串進行排序?

struct In?
{?
int data;?
char str[100];?
}s[100];?

//依照結構體中字符串str的字典順序排序?

int cmp ( const void *a , const void *b )?
{?
return strcmp( (*(In *)a)->str , (*(In *)b)->str );?
}?

qsort(s,100,sizeof(s[0]),cmp);?

七、計算幾何中求凸包的cmp?

int cmp(const void *a,const void *b) //重點cmp函數,把除了1點外的全部點,旋轉角度排序?
{?
struct point *c=(point *)a;?
struct point *d=(point *)b;?
if( calc(*c,*d,p[1]) < 0) return 1;?
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //假設在一條直線上,則把遠的放在前面?
return 1;?
else return -1;?
}?

PS:?

當中的qsort函數包括在<stdlib.h>的頭文件中,strcmp包括在<string.h>的頭文件中

轉載于:https://www.cnblogs.com/hrhguanli/p/4500504.html

總結

以上是生活随笔為你收集整理的C语言标准库函数qsort具体解释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。