先来比较两者的优缺点:
冒泡排序 | qsort排序 | |
优 | 简单,稳定 | 效率高,适用性广 |
劣 | 适用性差,速度慢 | 较为复杂 |
一、冒泡排序:
底层思路:

如此循环9轮得到

知道了思路就可以写代码了
#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;
}
