先来比较两者的优缺点:
冒泡排序 | qsort排序 | |
优 | 简单,稳定 | 效率高,适用性广 |
劣 | 适用性差,速度慢 | 较为复杂 |
一、冒泡排序:
底层思路:
![](https://img-blog.csdnimg.cn/img_convert/8eb0be8555c8e0e1728fd34f6e787950.png)
如此循环9轮得到
![](https://img-blog.csdnimg.cn/img_convert/c341211a8c8fb3a52376629eab3e1b61.png)
知道了思路就可以写代码了
#include<stdio.h>
void bubble_sort(int str[10],int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (str[j] > str[j + 1])
{
int tmp;
tmp = str[j];
str[j] = str[j + 1];
str[j + 1] = tmp;
}//比较相邻元素
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", str[i]);//打印排序好的数组
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
return 0;
}
但是这里只能排序整形数组,无法排序浮点型float数组和结构体struct stu等等
于是就到了qsort函数大显“神威“的时候了
二、qsort函数
头文件: #include<stdio.h>
用法:
void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
由此可见qsort函数包含四个参数:
1.首元素地址 2.数组内元素个数 3.每个元素的大小(字节) 4.排序方法(函数实现)
三、qsort排序具体运用
-
排序整形:
#include<stdio.h>
#include<stdlib.h>
int cmp_arr(void* e1, void* e2)
{
return *(int*)e2 - *(int*)e1;//从大到小
//return *(int*)e1 - *(int*)e2;//从小到大
}
void test()
{
int arr[10] = { 5,2,1,4,3,6,8,9,7,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz , sizeof(arr[0]), cmp_arr);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
test();
return 0;
}
-
排序结构体:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu {
char name;
int age;
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);//排序名字
}
void test()
{
struct Stu s[3] = { {"zhangsan",20} ,{"lisi",40},{"wangwu",30} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
int i = 0;
}
int main()
{
test();
return 0;
}
四、模仿qsort的功能实现一个通用的冒泡排序
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void Swap(char* e1, char* e2,int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = 0;
tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; 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[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/1d7c967a7a2b5d3cbeaa3ee432e62f49.png)