1.练习使用库函数,qsort排序各种类型的数据
qsort函数形式:
void qsort(void *base //指针,数组第一个元素
size_t num //排序数组元素个数
size_t size //元素大小
int(*compar)(const void*,const void*) //函数指针,两个元素比较
用qsort函数排序一个数组:
#include <stdio.h>
int cmp_int(const void* p1, const void* p2) {
if (*(int*)p1 > *(int*)p2)
return 1;
else if (*(int*)p1 == *(int*)p2)
return 0;
else
return -1;
}
int main() {
int arr[10] = { 9,18,23,45,11,24,55,99,44,12 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}
2.模仿qsort的功能实现一个通用的冒泡排序:
#include <stdio.h>
int cmp_int(const void* p1, const void* p2) {
if (*(int*)p1 > *(int*)p2)
return 1;
else if (*(int*)p1 == *(int*)p2)
return 0;
else
return -1;
}
void Swap(char* buf1, char* buf2, size_t width) {
for (int i = 0; i < width; i++) {
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//void *base是接纳所有类型类型,width是字节大小长度;
void bubble_sort(void* base, size_t sz, size_t width, int(*tmp)(const void* p1, const void* p2)) {
for (int i = 0; i < sz - 1; i++) { // <span style="color:red">修改循环条件为 sz - 1</span>
for (int j = 0; j < sz - i - 1; j++) { // <span style="color:red">修改循环条件为 sz - i - 1</span>
if (tmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int main() {
int arr[10] = { 9,18,23,45,11,24,55,99,44,12 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}