运用qsort函数对任意数据进行排序
#该内容是根据是听完比特课后,进行整理再加以自己的补充
qsort函数对任意数据进行排序
qsort函数介绍
qsort函数是专门用来对任意数据进行排序的函数,包括整型、浮点型、字符串、结构体函数等
qsort函数 void qsort(void* base,//base指向待排序数组的第一个元素的指针 size_t num,//base指向的数组的元素个数 size_t size,//base指向的数组中一个元素的大小,字节的长度 int(*cmp)(count void*,condt void*)//函数指针--传递函数的地址 );对整型数组进行排序
#include <stdio.h> #include <stdlib.h>//使用qsort函数时需要包含的头文件 #define N 10 void input_arr(int *arr,int sz) { printf("请输入%d个数据\n",N); for(int i = 0;i < sz;++i) { scanf("%d",arr+i); } } int cmp_qsort(const void*p1,const void*p2) { return (*(int *)p1-*(int *)p2); } void print_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { printf("%-3d",arr[i]); } } void test1() { int arr[N] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); input_arr(arr,sz); qsort(arr,sz,sizeof(arr[0]),cmp_qsort); print_arr(arr,sz); } int main(void) { test1(); return 0; }对结构体函数进行排序
分别通过姓名和年龄进行排序
//通过名字进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h> struct stu { char name[10]; int age; };//构造一个结构体包含名字和年龄两个变量 int cmp_by_name_qsort(const void*p1,const void*p2) { return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);//对于字符串运用strcmp函数进行比较,使用时要包含头文件string.h } void test2() { struct stu arr[] = {{"zhangsan",20},{"wangwu",22},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_by_name_qsort); for(int i = 0;i < sz;++i) { printf("%s %d\n",arr[i].name,arr[i].age);//对排序后的结构体函数进行输出 } } int main(void) { test2(); return 0; } //通过年龄进行排序 #include <stdio.h> #include <stdlib.h> struct stu { char name[10]; int age; }; int cmp_by_age_qsort(const void*p1,const void*p2) { return ((struct stu*)p1)->age-((struct stu*)p2)->age; } void test2() { struct stu arr[] = {{"zhangsan",20},{"wangwu",22},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_by_age_qsort); for(int i = 0;i < sz;++i) { printf("%s %d\n",arr[i].name,arr[i].age); } } int main(void) { test2(); return 0; }对冒泡排序函数进行改造
改造前
#include <stdio.h> void input_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { scanf("%d",&arr[i]); } } void bubble_sort(int *arr,int sz) { for(int i = 0;i < sz - 1;++i) { int flag = 1; for(int j = 0;j < sz - 1 - i;++j) { if(arr[j] > arr[j + 1]) { flag = 0; int temp = arr[j]; arr[j] = arr[j +1]; arr[j +1] = temp; } } if(flag == 1) { break; } } } void print_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { printf("%-3d",arr[i]); } printf("\n"); } int main(void) { int arr[10] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); input_arr(arr,sz); print_arr(arr,sz); bubble_sort(arr,sz); print_arr(arr,sz); return 0; }改造后
对整型数组进行排序
#include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_qsort(const void *p1,const void *p2) { return (*(char*)p1-*(char*)p2); } void swap(char*buf1,char*buf2,size_t width) { char tmp = 0; for(int i = 0;i < width;++i) { tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } print_arr(int *arr,int sz) { for(int i= 0;i < sz;++i) { printf("%d",arr[i]); } } void bubble_sotr(void *base,size_t sz,size_t width,int(*cmp)(const void *p1,const void *p2)) { for(int i = 0;i < sz - 1;++i) { for(int j = 0;j < sz - 1 -i;++j) { if(cmp((char*)base+width*j,(char*)base+width*(j+1))>0) swap((char*)base+width*j,(char*)base+width*(j+1),width); } } } void test() { int arr[10] = {9,8,7,6,5,4,3,2,1,0}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sotr(arr,sz,sizeof(arr[0]),cmp_qsort); print_arr(arr,sz); } int main(void) { test(); return 0; }对结构体数据进行排序(按照姓名)
#include <stdio.h> #include <string.h> #include <stdlib.h> struct stu { char name[20]; int age; }; void swap(char*buf1,char*buf2,size_t width) { char tmp = 0; for(int i = 0;i < width;++i) { tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } int cmp_qsort_by_name(const void *p1,const void *p2) { return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name); } void bubble_sotr(void *base,size_t sz,size_t width,int(*cmp)(const void *p1,const void *p2)) { for(int i = 0;i < sz - 1;++i) { for(int j = 0;j < sz - 1 -i;++j) { if(cmp((char*)base+width*j,(char*)base+width*(j+1))>0) swap((char*)base+width*j,(char*)base+width*(j+1),width); } } } void test() { struct stu arr[] = {{"zhangsan",20},{"wangwu",36},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sotr(arr,sz,sizeof(arr[0]),cmp_qsort_by_name); for(int i =0;i <sz;++i) { printf("%s %d",arr[i].name,arr[i].age); printf("\n"); } } int main(void) { test(); return 0; }