//使用基于数组的qsort快速排序函数,实现对各种类型的数据进行排序
1.先了解qsort
1)qsort是基于数组的快速排序函数
2) void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));//参数设计成void*的目的是使之范型化。
3) int (*compar)(const void*,const void*)//注意这两个参数是要比较的两个数组元素的地址,而非直接的数据。
4)需要根据qsort的 函数指针 参数的类型,来实现自己的回调函数
5)sqort 只对 compar 返回的正值感兴趣,也就是当返回正值才发生交换行为。
2.qsort与其回调函数各分工的关系
排序 == 比较+交换
回调函数做的事是比较,qsort自己做的是交换。
实现对整型数组的排序
实现对整型数组的排序
#include <stdio.h> #include <stdlib.h> int callBackCompare(const void* pa,const void* pb)//升序 { #if 0 if( *(int*)pa > *(int*)pb )//大于的时候交给sqort做交换 return 1; else return -1; #endif #if 0 return *(int*)pa - *(int*)pb; #endif } int main(void) { int arr[10] = {6,5,4,3,2,1,7,8,9,0}; qsort(arr,10,4,callBackCompare); return 0; }
实现对字符串的排序
#include <stdio.h> #include <stdlib.h> #include <string.h> int callBackCompare(const void* pa,const void* pb)//升序 { #if 0 //错误 if(strcmp(*(char*)pa,*(char*)pb) > 0) { return 1; } else { return -1; } #endif #if 0 //错误 解引用后只取了一个字节空间的数据 if(strcmp((char*)(*(char*)pa),(char*)(*(char*)pb)) > 0) { return 1; } else { return -1; } #endif #if 0 //正确 if(strcmp(*(char**)pa,*(char**)pb) > 0) { return 1; } else { return -1; } #endif #if 0 //正确,犯贱用法 解引用后取了四个字节空间的数据 if( strcmp( *(int*)pa, *(int*)pb ) > 0 ) { return 1; } else { return -1; } #endif } int main(void) { int i; char* arr[4] = {"dOracle","cHuaWei","aMicroSoft","bApple"}; qsort(arr,4,4,callBackCompare); for(i = 0;i<4;i++) { printf("%s\n",arr[i]); } return 0; }