複製鏈接
請複製以下鏈接發送給好友

qsort

鎖定
qsort函數C語言編譯器函數庫自帶的排序函數。qsort 的函數原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 是base所指數組進行排序。qsort函數包含在C 標準庫 - 中。 [1] 
中文名
qsort
外文名
qsort
應    用
C編程
類    型
標準庫函數
頭文件
stdlib.h
功 能
使用排序例程進行排序

qsort函數簡介

qsort函數聲明

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

qsort參數

  • base-- 指向要排序的數組的第一個元素的指針。
  • nitems-- 由 base 指向的數組中元素的個數。
  • size-- 數組中每個元素的大小,以字節為單位。
  • compar-- 用來比較兩個元素的函數,即函數指針(回調函數)
回調函數:
回調函數就是一個通過函數指針調用的函數。如果把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,就説這是回調函數。 [2] 
compar參數
compar參數指向一個比較兩個元素的函數。比較函數的原型應該像下面這樣。注意兩個形參必須是const void *型,同時在調用compar 函數(compar實質為函數指針,這裏稱它所指向的函數也為compar)時,傳入的實參也必須轉換成const void *型。在compar函數內部會將const void *型轉換成實際類型。
int compar(const void *p1, const void *p2);
如果compar返回值小於0(< 0),那麼p1所指向元素會被排在p2所指向元素的左面;
如果compar返回值等於0(= 0),那麼p1所指向元素與p2所指向元素的順序不確定;
如果compar返回值大於0(> 0),那麼p1所指向元素會被排在p2所指向元素的右面。 [2] 

qsort功 能

使用排序例程進行排序。

qsort説明

該函數不返回任何值。
頭文件:stdlib.h;

qsort應用示例

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int compare( const void *arg1, const void *arg2 );
int main( int argc, char **argv ) {
int i; /* Eliminate argv[0] from sort: */
argv++; argc--; /* Sort remaining args using Quicksort algorithm: */
qsort( (void *)argv(size_t)argc, sizeof( char * ), compare ); /* Output sorted list: */
for( i = 0; i < argc; ++i )
printf( " %s", argv[i] );
printf( "\n" );
}
int compare( const void *arg1, const void *arg2 ) { /* Compare all of both strings: */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}

qsort用法説明

qsort函數的用法説明如下: [1]  [3] 
例:qsort(a,1000,sizeof(int),comp);
其中comp函數應寫為:
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
上面是由小到大排序,return *(int *)b - *(int *)a; 為由大到小排序。
以下為compare函數原型 //comp
compare( (void *) & elem1, (void *) & elem2 );
Compare 函數的返回值
描述
< 0
elem1將被排在elem2前面
0
elem1 等於 elem2
> 0
elem1 將被排在elem2後面
(1)對一維數組的排序實例(從小到大排序):
#include<stdio.h>
#include<stdlib.h>
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int i=0;
int *array;
int n;
scanf("%d",&n);
array=(int*)malloc(n*sizeof(int));

for(;i<n;i++)
{
scanf("%d",(array+i));
}
qsort(array,n,sizeof(int),comp);
for(i=0;i<n;i++)
{
printf("%d\t",array[i]);
}
return 0;
}

對一個二維數組進行排序:
int a[1000][2]; 其中按照a[0]的大小進行一個整體的排序,其中a[1]必須和a[0]一起移動交換。//即第一行和第二行(a[0]和a[1]分別代表第一行和第二行的首地址)。使用庫函數排序的代碼量並不比用冒泡排序法小,但速度卻快很多。
qsort(a,1000,sizeof(int)*2,comp);

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

{
return((int*)a)[0]-((int*)b)[0];
}
(2)對字符串進行排序
int Comp(const void*p1,const void*p2)
{
return strcmp((char*)p2,(char*)p1);
}
int main()
{
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp);
//lenth為數組a的長度
(3)按結構體中某個關鍵字排序(對結構體一級排序):
structNode
{
double data;
int other;
}s[100];
int Comp(constvoid*p1,constvoid*p2)
{
return(*(Node*)p2).data>(*(Node*)p1).data?1:-1;
}
qsort(s,100,sizeof(s[0]),Comp);
按結構體中多個關鍵字排序(對結構體多級排序)[以二級為例]:
struct Node
{
int x;
int y;
}s[100];
//按照x從小到大排序,當x相等時按y從大到小排序
int Comp(const void*p1,const void*p2)
{
struct Node*c=(Node*)p1;
struct Node*d=(Node*)p2;
if(c->x!=d->x)returnc->x-d->x;
else return d->y-c->y;
}
對結構體中字符串進行排序:
struct Node
{
int data;
char str[100];
}s[100];
//按照結構體中字符串str的字典序排序
int Comp(const void*p1,const void*p2)
{
return strcmp((*(Node*)p1).str,(*(Node*)p2).str);
}
qsort(s,100,sizeof(s[0]),Comp);
(4)計算幾何中求凸包的Comp
int Comp(const void*p1,const void*p2)
//重點Comp函數,把除了1點外的所有的點旋轉角度排序
{
struct point*c=(point*)p1;
struct point*d=(point*)p2;
if(cacl(*c,*d,p[1])<0) return1;
elseif(!cacl(*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))
//如果在一條直線上,則把遠的放在前面
return1;
elsereturn-1;
}
參考資料
  • 1.    張權.Objective-C函數速查實例手冊 :人民郵電出版社,2014.2
  • 2.    尹德淳. C函數速查手冊:人民郵電出版社,2009.4
  • 3.    陳超 .C語言常用函數速查手冊:化學工業出版社,2010.6