1. 程式人生 > >.練習使用qsort函式排序各種型別的資料

.練習使用qsort函式排序各種型別的資料

今天我們介紹一下qsort函式,qsort是編譯器函式庫自帶的快速排序函式。

使用qsort()排序並用 bsearch()搜尋是一個比較常用的組合,使用方便快捷。

qsort 的函式原型是

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

各引數:1 待排序陣列首地址 2 陣列中待排序元素數量 3 各元素的佔用空間大小 4 指向函式的指標其中base是排序的一個集合陣列num是這個陣列元素的個數,width是一個元素的大小,comp是一個比較函式。比如:對一個長為

1000的陣列進行排序時,int a[1000]; 那麼base應為a,num應為 1000,width應為 sizeof(int),comp函式隨自己的命名qsort(a,1000,sizeof(int),comp);

2

3

4

intcomp(constvoid*a,constvoid*b)

{

return*(int*)a-*(int*)b;

}

Comp 函式編寫作用是由小到大排序,這裡只是需要comp函式返回正值、負值或者零即可。

#define _CRT_SECURE_NO_WARNINGS 1

 

#include<stdio.h>  

#include<stdlib.h>  

#include<math.h>  

#include<string.h>  

 

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

{

return (*(int*)a - *(int*)b);//a>b 返回正值  

}

 

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

{

return(*(char*)a - *(char*)b);

}

 

 

void main(void)

{

int i;

int a[10] = { 9, 1, 3, 2, 7, 5, 6, 4, 8, 0 };

char b[10] = { 'i', 'g', 'c', 'e', 'd', 'f', 'b', 'h', 'a', 'j' };

qsort(a, 10, sizeof(int), &cmp1);//對於函式指標(指向函式的指標),直接傳入函式名和函式名進行&  

//運算都是可以的,因為在呼叫函式時也是取的函式的地址  所以上下兩種呼叫函式的方式都是可以的

qsort(b, 10, sizeof(char), cmp2);

for (i = 0; i<10; i++)

printf("%d ", a[i]);

printf("\n");

for (i = 0; i<10; i++)

printf("%c ", b[i]);

printf("\n");

system("pause");

}


qsort(a, 10, sizeof(int), &cmp1); 這裡就是對陣列a進行排序,之後10代表著需要對a陣列中的十個元素進行排序,第三個sizeof(int)是在排序的時候每次需要操作的位元組,再往後的函式名cmp是對陣列a排序的法則,是正序還是倒序。

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

在排序函式中所有的引數前邊都加了const 為的是防止你在操作過程中對傳入資料無意間發生更改。

  在使用qsort函式時需要含有標頭檔案#include<stdlib.h>  

對於其他型別的資料也很簡單的就可以進行替換。