冒泡排序和qsort函数排序
冒泡排序
//冒泡排序 只能排序整型数据
void Bobble_sort(int arr[], int len) {
//遍历n-1趟
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
//两两比较,交换
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void print(int arr[], int len) {
int i = 0;
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[] = { 3,8,6,4,9,5,2,1,0,7 };
int len = sizeof(arr) / sizeof(arr[0]);
Bobble_sort(arr, len);
print(arr, len);
return 0;
}
qsort函数排序

base:待排序数组第一个对象的指针。
num:待排序数组元素的个数。
size:每个元素的大小。
int(*comper)(const void *,const void *):比较两个元素大小的函数指针。
通过comper函数指针调用相关的函数。
qsort函数排序整型数据
//qsort函数排序整型数据
int cmp_int(const void* e1, const void* e2) {
return *((int*)e1) - *((int*)e2);
//void不能直接解引用,必须强制类型转换
}
int main() {
int arr[] = { 3,8,6,4,9,5,2,1,0,7 };
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr, len, sizeof(arr[0]), cmp_int);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
qsort函数排序浮点数数据
//qsort函数排序浮点类型数据
int cmp_float(const void* e1, const void* e2) {
return ((int)(*(float*)e1 - *(float*)e2));
}
int main() {
float arr[] = { 3.4,1.2,5.6,2.0,6.6,4.5 };
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr, len, sizeof(arr[0]), cmp_float);
for (int i = 0; i < len; i++) {
printf("%.2f ", arr[i]);
}
return 0;
}
qsort函数排序结构体类型
//qsort函数排序结构体类型
//定义结构体
struct stu
{
char name[10];
int age;
};
int cmp_by_name(const void* e1, const void* e2) {
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
//字符串比较使用strcmp
}
//int cmp_by_age(const void* e1, const void* e2) {
// return (((struct stu*)e1)->age - ((struct stu*)e2)->age);
//}
int main() {
struct stu s[] = { {"wang xi",25},{"zhao min",18},{"chaoli",36} };
int len = sizeof(s) / sizeof(s[0]);
qsort(s, len, sizeof(s[0]), cmp_by_name);
//qsort(s, len, sizeof(s[0]), cmp_by_age);
for (int i = 0; i < len; i++) {
printf("%s ", s[i].name);
}
/*for (int i = 0; i < len; i++) {
printf("%d ", s[i].age);
}*/
return 0;
}
利用冒泡排序实现qsort函数排序
//利用冒泡排序实现qsort函数排序
int cmp_int(const void* e1, const void* e2) {
return *((int*)e1) - *((int*)e2);
}
void Swap(char* buf1, char* buf2, int width) {
for (int i = 0; i < width; i++) {
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void Bubble_sort(void* base, int len, int width, int(*cmp)(const void* e1, const void* e2)) {
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (cmp((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[] = { 3,8,6,4,9,5,2,1,0,7 };
int len = sizeof(arr) / sizeof(arr[0]);
Bubble_sort(arr, len, sizeof(arr[0]), cmp_int);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)中cmp是回调函数,通过函数指针调用相应的函数,cmp指向cmp_int,cmp_float,cmp_by_name等。
本文介绍冒泡排序算法及qsort函数的应用,包括基本原理、实现代码及如何对整型、浮点数和结构体进行排序。还展示了如何用冒泡排序实现qsort函数的功能。

被折叠的 条评论
为什么被折叠?



