qsort库函数排序

简介: qsort库函数排序

void*一人饮酒醉,醉把char*,width成双对


quick sort快速排序原函数解释

image.png

用qsort

#include<stdio.h>
#include<stdlib.h>
struct Stu
{
  char name[20];
  int age;
};
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
int cmp_float(const void* e1, const void* e2)
{
  return (int)(*(float*)e1 - *(float*)e2);
}
//结构体排序有不同排序方法,每个人的标准不同,有人是名字,有人是姓名
int cmp_stu_age(const void* e1, const void* e2)
{
  return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_stu_name(const void* e1, const void* e2)
{
  //名字比较就是比较字符串
  //字符串比较不能直接用<>=来比较,应该用strcmp来比较
  return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
void test_int()
{
  int arr[10] = { 0,5,6,3,5,9,6,5,3,9 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_int);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%2d ", arr[i]);
  }
  printf("\n");
}
void test_float()
{
  float arr[10] = { 0.0,5.0,6.0,3.0,5.1,9.0,6.3,5.6,3.3,9.5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_float);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%f ", arr[i]);
  }
  printf("\n");
}
void test_stu_age()
{
  struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  int sz = sizeof(s) / sizeof(s[0]);
  qsort(s, sz, sizeof(s[0]), cmp_stu_age);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%s  ", (&s[i])->name);
    printf("%d  ", (&s[i])->age);
  }
  printf("\n");
}
void test_stu_name()
{
  struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  int sz = sizeof(s) / sizeof(s[0]);
  qsort(s, sz, sizeof(s[0]), cmp_stu_name);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%s  ", (&s[i])->name);
    printf("%d  ", (&s[i])->age);
  }
  printf("\n");
}
int main()
{
  test_int();
  test_float();
  test_stu_age();
  test_stu_name();
  return 0;
}

image.png


一般到了这里肯定想自己写个qsort,因此我们仿写一个为BubbleSort

image.png

image.png


漂亮之处void万能类型和char*,字宽width的联合出击

image.png

image.png

用BubbleSort

#include<stdio.h>
struct Stu
{
  char name[20];
  int age;
};
//自己写一个万能交换函数
void Swap(char* buf1, char* buf2,int width)
{
  size_t i = 0;
  for (i = 0; i < width; i++)
  {
    char tmp = *buf1;
    *buf1 = *buf2;
    *buf2 = tmp;
    buf1++;
    buf2++;
  }
}
//自己写一个冒泡函数,使用回调函数实现一个通用的冒泡排序函数
BubbleSort(void* base, int num, size_t width, int (*cmp)(const void* e1, const void* e2))
{
  int i = 0;
  //趟数
  for (i = 0; i < num - 1; i++)
  {
    //比较的对数
    int j = 0;
    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);
      }
    }
  }
}
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
int cmp_float(const void* e1, const void* e2)
{
  return (int)(*(float*)e1 - *(float*)e2);
}
int cmp_stu_age(const void* e1, const void* e2)
{
  return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_stu_name(const void* e1, const void* e2)
{
  //名字比较就是比较字符串
  //字符串比较不能直接用<>=来比较,应该用strcmp来比较
  return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test_int()
{
  int arr[10] = { 0,5,6,3,5,9,6,5,3,9 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  BubbleSort(arr, sz, sizeof(arr[0]), cmp_int);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%2d ", arr[i]);
  }
  printf("\n");
}
void test_float()
{
  float arr[10] = { 0.0,5.0,6.0,3.0,5.1,9.0,6.3,5.6,3.3,9.5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  BubbleSort(arr, sz, sizeof(arr[0]), cmp_float);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%f ", arr[i]);
  }
  printf("\n");
}
void test_stu_age()
{
  struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  int sz = sizeof(s) / sizeof(s[0]);
  BubbleSort(s, sz, sizeof(s[0]), cmp_stu_age);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%s  ", (&s[i])->name);
    printf("%d  ", (&s[i])->age);
  }
  printf("\n");
}
void test_stu_name()
{
  struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  int sz = sizeof(s) / sizeof(s[0]);
  BubbleSort(s, sz, sizeof(s[0]), cmp_stu_name);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%s  ", (&s[i])->name);
    printf("%d  ", (&s[i])->age);
  }
  printf("\n");
}
int main()
{
  test_int();
  test_float();
  test_stu_age();
  test_stu_name();
  return 0;
}

image.png


目录
相关文章
|
C语言
C语言之冒泡法对数组元素进行排序
C语言之冒泡法对数组元素进行排序
|
7月前
|
编译器 C语言
库函数qsort的使用及利用冒泡排序模拟实现qsort
库函数qsort的使用及利用冒泡排序模拟实现qsort
|
6月前
|
C语言
qsort函数的应用
qsort函数的应用
38 0
|
存储 算法 测试技术
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
52 0
|
搜索推荐 C语言
C语言做题常用排序函数-qsort
C语言做题常用排序函数-qsort
|
C语言 数据库管理
还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!
还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!
86 1
|
C语言
妙用指针实现qsort
妙用指针实现qsort
77 0
|
算法 编译器 C语言
排序之玩转qsort函数——【C语言】
说起排序,我们会想起许多算法,在之前的博客中我也写到过,比如:冒泡排序法、快速排序法、选择排序法等等。其实在C语言中一直有一个可以将数组中的内容进行排序的函数且功能完善内容齐全的库函数——qsort函数。今天就让我们来探索一下吧!
56 0
下一篇
DataWorks