目录
1.简单介绍qsort
2.模仿qsort实现冒泡排序
qsort函数原型
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
一些解释:
1.base:指向要排序数组的第一个对象 类型为void*
2.num:base所指向数组的元素总数 类型为unsigned int
3.size:数组中每个元素的大小(以字节为单位) 类型为unsigned int
4.compor:指向比较两个元素的函数,它需要遵循以下原型
int compar (const void* p1, const void* p2);
以两个指针为参数
返回值
用qsort函数完成排序
整数快排
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*) a - *(int * )b; //从小到大
//return *(int*) b - *(int*) a; //从大到小
}
int main(){
int num[8] = { -1,5,8,6,7,4,18,-6 };
int len = 8;
qsort(num, len, sizeof(int), cmp);
for (int i = 0;i < len;++i) {
printf("%d ", num[i]);
}
printf("\n");
system("pause");
return 0;
}
字符串快排
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(char *)a - *(char*)b;
}
int main() {
char str[7][9] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July"
};
int sum = 7;
int i;
printf("排序前:\n");
for (i = 0; i < sum; i++)
{
printf("%s\n", str[i]);
}
qsort(str, sum, sizeof(char)*9, cmp);
printf("排序后:\n");
for (i = 0; i < sum; i++)
{
printf("%s\n", str[i]);
}
system("pause");
return 0;
}
模仿qsort实现冒泡排序
因为是模仿qsort 所以函数原型与qsort相同 下面直接给出代码
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
int int_cmp(const void *a, const void *b) {
return *(int*)a - *(int *)b;
}
void bubble(void *arr, int size, int wid, int(*cmp)(const void *a, const void *b)) {
for (int i = 0;i < size - 1;++i) {
for (int j = 0;j < size - 1 - i;++j) {
if (cmp((int*)arr + j , (int *)arr + (j + 1) )>0) {
swap((int*)arr + j, (int *)arr + (j + 1));
}
}
}
}
int main() {
int arr[8] = { 0,4,6,8,2,10,7,3 };
int size = sizeof(arr) / sizeof(arr[0]);
int wid = sizeof(arr[0]);
bubble(arr, size, wid, int_cmp);
for (int i = 0;i < size;++i) {
printf("%d ", arr[i]);
}
puts("\n");
system("pause");
return 0;
}
一些解释
bubble函数中 if 那一行的作用是在 比较arr数组中元素的大小
arr+j和arr+j+1比较
这里涉及一维数组的相关知识
一维数组名相当于首元素的首地址
+1相当于向左偏移了一个元素的大小