C语言模拟实现qsort函数

it2025-11-07  13

排整数:

#include<stdio.h> #include<stdlib.h> void qsort( void *base, size_t num, size_t width, int(__cdecl *compare)(const void *elem1, const void *elem2)//elem1 elem2要比较元素的地址 ); int cmp_int(const void *elem1, const void *elem2) { return *(int*)elem1 - *(int*)elem2; } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; int sz = sizeof(arr) / sizeof(arr[0]); print_arr(arr, sz); qsort(arr, sz, sizeof(arr[0]), cmp_int); print_arr(arr, sz); return 0; }

输出结果:

排结构体:

struct S { char name[20]; int age; }; int cmp_stu_by_age(const void *e1, const void *e2) { return (*(struct S*)e1).age - (*(struct S*)e2).age; } //qsort 排序结构体数组 void test2() { struct S arr[] = { { "zhangsan", 20 }, { "lisi", 80 }, { "wangwu", 5 } }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age); } int main() { test2(); return 0; }

struct S { char name[20]; int age; }; int cmp_stu_by_name(const void *e1, const void *e2) { return strcmp((*(struct S*)e1).name, (*(struct S*)e2).name); } //qsort 排序结构体数组 void test3() { struct S arr[] = { { "zhangsan", 20 }, { "lisi", 80 }, { "wangwu", 5 } }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name); } int main() { test3(); return 0; }

关于viod*

int main() { int a = 10; int* pa = &a; char ch = 'w'; //char* pc = &a; //err void* pv = &a; //void*是无具体类型的指针 可以接受任何类型指针 //不能直接进行+—整数操作 不能直接解引用操作 return 0; }

模拟实现my_qsort

void qsort( void *base, size_t num, size_t width, int(__cdecl *compare)(const void *elem1, const void *elem2)//elem1 elem2要比较元素的地址 ); void _swap(char* buff1, char*buff2, int width) { int i = 0; for (i = 0; i < width; i++) { char tmp = *(buff1 + i); *(buff1 + i) = *(buff2 + i); *(buff2 + i) = tmp; } } //模拟实现my_qsort void my_qsort(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) { //交换 //方法一: /*int k = 0; for (k = 0; k < width; k++) { char tmp = *((char*)base + j*width + k); *((char*)base + j*width + k) = *((char*)base + (j + 1)*width + k + 1); *((char*)base + (j + 1)*width + k + 1) = tmp; }*/ //方法二: _swap((char*)base + j*width, (char*)base + (j + 1)*width, width); } } } } int cmp_int(const void *elem1, const void *elem2) { return *(int*)elem1 - *(int*)elem2; } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; int sz = sizeof(arr) / sizeof(arr[0]); print_arr(arr, sz); my_qsort(arr, sz, sizeof(arr[0]), cmp_int); print_arr(arr, sz); return 0; }

输出结果:

最新回复(0)