前言:我们都已经知qsort能够帮我们排多种多样的数组,作为一名编程小白,自然就要探讨【qsort】究竟是怎么实现的?接下来我们就来模拟实现qsort函数的实现。
1.主函数
首先,我们先随便给定一个主函数,数组给个整型数组。
int main() {
int sz;
int arr[] = { 9,8,7,6,5,4,3,2,1 };//需要排的数组
sz = sizeof(arr) / sizeof(arr[0]);
mock_qsort(arr, sz, sizeof(arr[0]), compare_element);//待实现qsort排序
print(sz, arr);//打印数组
return 0;
}
mock_qsort 实现t
传什么类型参数自然用什么类型形参
传参以及如何找到每一个元素
void mock_qsort(void* pa, int el_sum, int el_size, int (*compare)(const void* e1, const void* e2)) {
int i = 0;
for (i = 0; i < el_sum - 1; i++) {
int j = 0;//排序次数
for (j = 0; j < el_sum - 1 - i; j++) {
//我不知道void*pa将会是一个什么类型的指针,于是将索性将强制转化成char*(+1跳过1字节)
//的指针,再根据每个元素大小找到下一个元素
if (compare((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size) > 0) {
//将需要交换元素首字节地址传过去,与地址
swap((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size, el_size);
}
}
}
}
实现比较元素大小
int compare(const void*pa1,const void*pa2) {
return *(int*)pa1 - *(int*)pa2;
}
如何实现元素的交换
实现元素的交换(既然是字符型地址,+1自然跳过一个字节,我们交换元素可以将每一个字节都交换,这样元素自然也就交换了)
void swap(char* pa1, char* pa2, int element_size) {
int i = 0;
for (i = 0; i < element_size; i++) {
char store = *pa1;
*pa1 = *pa2;
*pa2 = store;
pa1++;
pa2++;
}
}
最后我们再实现一个打印函数pirnt即可
void print(int sz, int* arr) {
for (int i = 0; i < sz; i++) {
printf("%d ", *(arr + i));
}
}
2.完整代码
int compare(const void*pa1,const void*pa2) {
return *(int*)pa1 - *(int*)pa2;
}
void print(int sz, int* arr) {
for (int i = 0; i < sz; i++) {
printf("%d ", *(arr + i));
}
}
void swap(char* pa1, char* pa2, int element_size) {
int i = 0;
for (i = 0; i < element_size; i++) {
char store = *pa1;
*pa1 = *pa2;
*pa2 = store;
pa1++;
pa2++;
}
}
void mock_qsort(void* pa, int el_sum, int el_size, int (*compare)(const void* e1, const void* e2)) {
int i = 0;
for (i = 0; i < el_sum - 1; i++) {
int j = 0;
for (j = 0; j < el_sum - 1 - i; j++) {
if (compare((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size) > 0) {
swap((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size, el_size);
}
}
}
}
int main() {
int sz;
int arr[] = { 9,8,7,6,5,4,3,2,1 };
sz = sizeof(arr) / sizeof(arr[0]);
mock_qsort(arr, sz, sizeof(arr[0]), compare);
print(sz, arr);
return 0;
}