實(shí)現(xiàn)一個(gè)bubble_sort(冒泡排序),可以完成不同類型數(shù)據(jù)的排序
需要借助庫函數(shù)qsort 的思想去實(shí)現(xiàn)!
先完成函數(shù)原型:void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b));
該函數(shù)的四個(gè)參數(shù)和qsort 的四個(gè)參數(shù)使用方法相同(如不清楚可參考我的上一篇對qsort詳細(xì)介紹的博客);
同時(shí)需要完成比較函數(shù),即第四個(gè)參數(shù)函數(shù)指針。
例(對整數(shù)的排序):
實(shí)現(xiàn)對整數(shù)的比較,
int IntCmp(const void* a, const void* b) //比較整型a,b的大小 {return (*(int*)a>*(int*)b) ? 1 : -1;}
然后在void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b))函數(shù)內(nèi)部按照一般的冒泡排序思路編程即可,
注意的是該函數(shù)在進(jìn)行交換元素的時(shí)候以字節(jié)為單位進(jìn)行交換;
交換函數(shù)如下:
void swap(size_t width, void* a, void* b) //按字節(jié)將兩任意類型交換 {char temp;int k = 0;for (k = 0; k<(int)width; k++){temp = *((char*)a + k);*((char*)a + k) = *((char*)b + k);*((char*)b + k) = temp;}}
具體思路如上,我以整型排序和字符串?dāng)?shù)組的排序?yàn)槔瓿闪艘韵麓a:
#include<stdio.h>#include<string.h>int IntCmp(const void* a, const void* b) //比較整型a,b的大小 { return (*(int*)a>*(int*)b) ? 1 : -1;}int StrCmp(const void* a, const void* b) //比較字符串?dāng)?shù)組(可理解為二級指針)的大小 { return strcmp((char*)(*(int*)a), (char*)(*(int*)b))>0 ? 1 : -1;}void swap(size_t width, void* a, void* b) //按字節(jié)將兩任意類型交換 { char temp; int k = 0; for (k = 0; k<(int)width; k++) { temp = *((char*)a + k); *((char*)a + k) = *((char*)b + k); *((char*)b + k) = temp; }}void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b)){ int i = 0; int j = 0; int ret = 0; for (i = 0; i<(int)num - 1; i++) { for (j = 0; j<(int)num - i - 1; j++) { ret = compare(((char*)base + j*width), ((char*)base + (j + 1)*width)); //前面數(shù)據(jù)大返回1,否則返回-1 if (ret>0) //將大的數(shù)據(jù)換到后面 { swap(width, ((char*)base + j*width), ((char*)base + (j + 1)*width)); } } }}int main(){ int i=0; int arr1[10]={1,3,5,7,9,2,4,6,8,10}; int len=sizeof(arr1)/sizeof(arr1[0]); bubble_sort(arr1,len,sizeof(arr1[0]),IntCmp); for(i=0;i<len;i++) { PRintf("%d ",arr1[i]); } /*int i = 0; char* arr[4] = { "aaa", "ddd", "ccc", "bbb" }; int len = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, len, sizeof(arr[0]), StrCmp); for (i = 0; i<len; i++) { printf("%s ", arr[i]); }*/ return 0;}整型排序結(jié)果:
字符串?dāng)?shù)組(二維數(shù)組)排序結(jié)果:

|
新聞熱點(diǎn)
疑難解答