C言語qsort関数の使い方(個人メモ)

15000 ワード

前言:私が羅列した使い方はよく使われている使い方だけでよく知られていますが、ソートはよくありますが、c言語にはパッケージされた関数があります.今、紹介します.ヘッダファイルstdlib.h中
qsort(* a,n,sizeof(a[0]),cmp);
1番目のパラメータaはポインタタイプ変数であり、ソートに関与する要素の先頭アドレス(一般的には配列名)2番目のパラメータnはソートに関与する要素の個数3番目のパラメータはソート要素ごとの空間サイズ4番目のパラメータは関数(比較関数)である.以下、cmp比較関数の書き方に重点を置く
int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b; //      
    //return *(int *)b - *(int *)a;       
}

一、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 - *(int *)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 ;  
}  
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);