目录
1.简单介绍qsort
2.模仿qsort实现冒泡排序
一些解释:
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相同 下面直接给出代码
#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相当于向左偏移了一个元素的大小