qsort函数——快速排序

简介: 本篇讲qsort函数的使用和如何模拟实现qsort函数

前言

本篇讲qsort函数的使用和如何模拟实现qsort函数

一、函数头文件

#include<stdlib.h>

二、函数声明

void qsort(void* base, //指向了需要排序的数组的第一个元素
           size_t num, //排序的元素个数
           size_t size,//一个元素的大小,单位是字节
           int (*cmp)(const void*, const void*)//函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素
          );

三、 参数

  • base -- 指向要排序的数组的第一个元素的指针。
  • num -- 由 base 指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • cmp -- 函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素

四、返回值

该函数不返回任何值。

五、cmp不同类型排序

1、int类型

升序排列
int cmp(const void *a,const void *b) {
  return *(int*)a-*(int*)b;
}
//降序排列 
//return *(int*)b-*(int*)a;

2.double类型

升序排列
int cmp(const void *a,const void *b) {
  return *(double*)a-*(double*)b;
}
//降序排列 
//return *(double*)b-*(double*)a;

3.char类型

升序排列
int cmp(const void *a,const void *b) {
  return *(char*)a-*(char*)b;
}
//降序排列 
//return *(char*)b-*(char*)a;

4、结构体类型

struct Stu
{
  char name[20];
  int age;
};
int cmp_struct_age(const void* p1, const void* p2)
{
  return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

六、使用展示

#include<stdio.h>
#include<stdlib.h>
//int类型
int int_cmp(const void* p1, const void* p2)
{
  return(*(int*)p1 - *(int*)p2);
}
int test1()
{
  int arr[] = { 1,3,5,7,9,2,4,6,8,0 };
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
}
//结构体类型
struct Stu
{
  char name[20];
  int age;
};
int cmp_struct_age(const void* p1, const void* p2)
{
  return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
void test2()
{
  struct Stu arr[] = { {"zhangsan",20},{"lisi",50},{"wangwu",15}};
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_age);
}
int main()
{
  test1();
  test2();
  return 0;
}

七、模拟实现qsort函数

#include<stdio.h>
int int_cmp(const void* p1, const void* p2)
{
  return (*(int*)p1 - *(int*)p2);
}
void swap(void* p1, void* p2, int size)
{
  int i = 0;
  for (i = 0; i < size; i++)
  {
    char tmp = *((char*)p1 + i);
    *((char*)p1 + i) = *((char*)p2 + i);
    *((char*)p2 + i) = tmp;
  }
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
  int i = 0;
  for (i = 0; i < count - 1; i++)
  {
    int j = 0;
    for (j = 0; j < count - 1 - i; j++)
    {
      if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
      {
        swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
      }
    }
  }
}
int main()
{
  int arr[] = { 25,35,68,79,21,13,98,7,16,62 };
  bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

行文至此,请放心食用,如有疑惑,欢迎评论区留言!

目录
相关文章
|
3月前
|
搜索推荐 C++
C++冒泡排序的实现
C++冒泡排序的实现
|
3月前
|
搜索推荐 算法 C语言
冒泡排序:从小到大轻松搞定数组排序(c语言代码)
冒泡排序:从小到大轻松搞定数组排序(c语言代码)
157 0
|
2月前
|
算法 Java
冒泡排序就是这么容易
冒泡排序就是这么容易
18 1
|
3月前
|
搜索推荐 容器
数组中的冒泡排序与选择排序
数组中的冒泡排序与选择排序
|
3月前
冒泡排序的快速排序——qsort函数的模拟实现
冒泡排序的快速排序——qsort函数的模拟实现
20 1
|
3月前
|
算法 搜索推荐 C语言
快速排序和qsort函数详解详解qsort函数
快速排序和qsort函数详解详解qsort函数
61 0
|
10月前
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
52 0
|
10月前
|
搜索推荐 C语言
冒泡排序与qsort函数详解
提及到排序,冒泡排序算是一个很基础的排序了。那么冒泡排序到底是什么呢?冒泡排序在什么情况下使用呢?qsort函数又是什么呢?接下来我给大家通过举例来详细解释一下。
48 0
C中的快速排序qsort()
以前我所有的排序都是用的冒泡排序,因为那时觉得冒泡排序结构简单,还容易理解,真的是解决排序一头雄狮,自从遇见qsort(),我就知道这位草原霸主的地位已经不保了。
|
算法 C语言