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;
}

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

目录
相关文章
归并排序及其非递归实现
归并排序及其非递归实现
41 0
|
2月前
冒泡排序 和 qsort排序
冒泡排序 和 qsort排序
16 1
|
6月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
45 0
|
6月前
|
搜索推荐
冒泡排序、选择排序、二分查找
冒泡排序、选择排序、二分查找
28 0
|
7月前
冒泡排序的快速排序——qsort函数的模拟实现
冒泡排序的快速排序——qsort函数的模拟实现
43 1
|
7月前
|
算法 搜索推荐 C语言
快速排序和qsort函数详解详解qsort函数
快速排序和qsort函数详解详解qsort函数
110 0
|
搜索推荐 C语言
冒泡排序与qsort函数详解
提及到排序,冒泡排序算是一个很基础的排序了。那么冒泡排序到底是什么呢?冒泡排序在什么情况下使用呢?qsort函数又是什么呢?接下来我给大家通过举例来详细解释一下。
63 0
【交换排序】冒泡排序 与 快速排序
【交换排序】冒泡排序 与 快速排序
|
存储 算法 搜索推荐
非递归算法——快速排序、归并排序
​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序、归并排序,非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ ​
179 0