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