qsort包含在<stdlib.h>頭文件中,此函數(shù)根據(jù)你給的比較條件進行快速排序,通過指針移動實現(xiàn)排序。排序之后的結(jié)果仍然放在原數(shù)組中。使用qsort函數(shù)必須自己寫一個比較函數(shù)。
函數(shù)原型:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
用法以及參數(shù)說明:
base ——要排序的數(shù)組起始地址(數(shù)組名)
num ——數(shù)組元素個數(shù)
size ——數(shù)組每一個元素的大小
comparator ——函數(shù)指針,指向比較函數(shù)(比較規(guī)則)
例如:
typedef struct


{
char p1[11];
char p2[11];
}T;
T str[size];

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


{
return strcmp(((T*)a)->p2, ((T*)b)->p2);
}
………………
………………
………………
qsort(str, i, sizeof(T), q_cmp);
一、對int類型數(shù)組排序
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;//*(int *)a表示a所指向的地址的內(nèi)容
}
qsort(num,100,sizeof(num[0]),cmp);
二、對char類型數(shù)組排序(同int類型)
char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
三、對double類型數(shù)組排序
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);
四、對結(jié)構(gòu)體一級排序
struct Sample
{
double data;
int other;
}s[100]
//按照data的值從小到大將結(jié)構(gòu)體排序
int cmp( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
五、對結(jié)構(gòu)體二級排序
struct Sample
{
int x;
int y;
}s[100];
//按照x從小到大排序,當x相等時按照y從大到小排序
int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)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 Sample
{
int data;
char str[100];
}s[100];
//按照結(jié)構(gòu)體中字符串str的字典順序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
附加一個完整點的代碼,對字符串二維數(shù)組排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[2001][1001];
int cmp(const void *a, const void *b){
return strcmp((char *)a,(char *)b);
}
int main(){
int i,n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++) gets(s[i]);
qsort(s,n,1001*sizeof(char),cmp);
for(i=0;i<n;i++) puts(s[i]);
return 0;
}
引用于slyar