C语言中对数据进行排序,但数据类型有很多种,比如整形,字符型,浮点型,结构体型等等,
用冒泡排序只能对一种类型进行排序,很不方便,这就需要一个强大的函数了。
qsort可以对各种类型的数据进行排序,但要用合理的方法去用它
qsort的使用
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
qsort需要四个参数,前三个很好理解,第四个参数用来比较两个元素,返回的整形。
qsort 的使用
代码示例:
//比较两个数的大小 int int_cmp(const void* p1, const void* p2) { return *(int*)p1 - *(int*)p2; } //打印数组 void print(int* arr,int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } printf("\n"); } #include<stdio.h> int main() { int arr[10] = { 2,4,1,4,8,6,5,9,7,5 }; int sz = sizeof(arr) / sizeof(arr[0]); int width = sizeof(int); printf("排序前:"); print(arr, sz); qsort(arr, sz, width, int_cmp); printf("排序后:"); print(arr,sz); return 0; }
用冒泡排序模拟qsort 的实现
因为qsort可以排列不同类型的数据,所以int_comp函数里要用void*指针来接收
进行交换,注意要转化成char类型!
最后浅浅打印一下
完整代码:
#include<stdio.h> int int_comp(const void* p1, const void* p2) { return *((int*)p1) - *((int*)p2); } void swap(void* e1, void* e2, int width) { int i = 0; for (i = 0; i < width; i ++ ) { char tem = *((char*)e1 + i); *((char*)e1 + i) = *((char*)e2 + i); *((char*)e2 + i) = tem; } } void _qsort(void* arr, int sz, int width, int(*comp)(void* p1, void* p2)) { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (comp((char*)arr+j*width, (char*)arr + (j+1) * width) > 0) { swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width); } } } } void print(int arr[],int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { //qsort的模拟 //排列整型 int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); int width = sizeof(int); print(arr, sz); _qsort(arr, sz, width, int_comp); print(arr, sz); return 0; }
这个模拟qsort函数也是很强大的,这里只排序了整形,还可以排序字符型,结构体等等。
这是我对qsort函数的一些理解。