.練習使用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是一個比較函式。比如:對一個長為
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>
對於其他型別的資料也很簡單的就可以進行替換。