目录
一、qsort函数的使用
二、qsort函数的模拟
一、qsort函数的使用
快排函数qsort是C的库函数,它可以对输入的任何类型的数组排序,通过该函数的函数声明我们可以看出它的使用方法:
举个栗子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp1(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}int cmp2(const void* e1, const void* e2)
{return *(char*)e1 - *(char*)e2;
}int main()
{int arr1[] = { 2,4,1,5,3,7 };size_t num1 = sizeof(arr1) / sizeof(arr1[0]);size_t sz1 = sizeof(arr1[0]);char arr2[] = "kstnhmlw";size_t num2 = strlen(arr2);size_t sz2 = sizeof(char);//整型数组排序qsort(arr1, num1, sz1, cmp1); for (size_t i = 0; i < num1; i++){printf("%d ", arr1[i]);}printf("\n");//字符型数组排序qsort(arr2, num2, sz2, cmp2); printf("%s\n", arr2);return 0;
}
二、qsort函数的模拟
qsort函数最大的特点是对任意类型数组排序,要实现这一点只要采用和qsort函数声明一样的数据类型即可。在这里,qsort函数的排序方法我们使用冒泡排序。
//qsort函数的模拟
void Swap(char* n1, char* n2, size_t width)
{//一个字节一个字节的交换for (size_t i = 0; i < width; i++){char tmp = *(n1 + i);*(n1 + i) = *(n2 + i);*(n2 + i) = tmp;}
}
void my_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))
{size_t i = 0;size_t j = 0;for (i = 0; i < num - 1; i++){for (j = 0; j < num - 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);}}}
}