冒泡排序实现快速排序qsort C语言

简介: 冒泡排序实现快速排序qsort C语言

快速排序        


在实现快速排序之前我们要先知道快速排序是什么。简单说其实就是排序各种类型的数据,比如整型,结构体等等都可以,我们这里是用冒泡排序去写的,因为目前也只学习了冒泡排序哈,后面会再有其他版本的,


image.png


这里我们看到qsort4个参数,下面一一来解释。


基本使用


image.png


值得注意的是我们要自己实现一个比较函数,至于为什么是因为写qsort函数的人也不知道使用者要用来比较什么,又或者大到小或者小到大排序,所以需要我们自己去实现一个比较函数,因为使用者知道自己要比较的数据是什么类型的。


参数解释


image.png


qsort函数第一个参数是要比较数组的起始地址,第二个参数是数组元素个数,第三个参数是每个元素大小,第四个参数是比较函数。 ‘


模拟实现


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//这里整型是这样写的,但是比较其他数据就会变哈
int cmp_int(const void* e1,const void* e2)
{
  return (*(int*)e1 - *(int*)e2);
}
//打印函数
void Print(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ",arr[i]);
  }
}
//交换函数
void swap(void* p1, void* p2, size_t width)
{
  int i = 0;
    //因为要交换这么多长度次,所以要for循环
  for (i = 0; i < width; i++)
  {
    char tmp = *((char*)p1 + i);
    *((char*)p1 + i) = *((char*)p2 + i);
    *((char*)p2+i) = tmp;
  }
}
void bubble_qsort(void* base, size_t num, size_t width, int(* cmp)(const void* e1, const void* e2))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < num; i++)
  {
    for (j = 0; j < num-i-1; j++)
    {
            //强制类型转换为char*  这里加上j*width值得注意
      if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0)
        swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
    }
  }
}
int main()
{
  int arr[] = { 1,3,2,5,7,9,8,4,6 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  //qsort(arr, sz, sizeof(int), cmp_int);
  bubble_qsort(arr, sz, sizeof(int), cmp_int);
  Print(arr, sz);
  return 0;
}

首先我们要注意的是参数类型都是void* 的,为的就是更好得去使用,因为作者是不知道我们要使用时是用什么类型。

再就是在内部转换成char* 类型,这样就可以一个字节一个字节去比较和交换。

这里的实现bubble_qsort函数要注意的是两个for循环一个是小于num,一个是小于num-i-1,就是总趟数,还有一个是每个元素要比较的次数,这个和冒泡排序是一样的。  



今天的内容就到这里了哈!!!

要是认为作者有一点帮助你的话!

就来一个点赞加关注吧!!!当然订阅是更是求之不得!

赠人玫瑰,手有余香=。=!

最后的最后感谢大家的观看!!!

你们的支持是作者写作的最大动力!!!

下期见哈!!!

相关文章
|
1月前
|
搜索推荐 算法 C语言
C语言:冒泡排序
C语言:冒泡排序
|
1月前
|
搜索推荐 C语言
c语言从入门到实战——回调函数与qsort的讲解和模拟实现
回调函数是一个函数,它作为参数传递给另一个函数,并且能够在该函数内部被调用。在C语言中,回调函数通常被用于实现事件处理和排序算法中。 `qsort`是C标准库中的一个排序函数,它可以对任意类型的数组进行排序。`qsort`需要三个参数:要排序的数组、数组元素的个数和一个指向回调函数的指针。回调函数必须满足两个条件:能够比较数组中的元素,返回一个整数表示它们之间的大小关系;并且它应该能够被`qsort`函数调用。 回调函数是一种在编程中广泛使用的技术,它允许一个函数作为参数传递给另一个函数,并在需要时被调用。这种机制使得代码更加灵活和可重用。
26 0
|
1月前
|
C语言
C语言-----qsort函数的功能以及模拟实现
C语言-----qsort函数的功能以及模拟实现
27 1
|
1月前
|
Java C语言
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
28 0
|
25天前
|
搜索推荐 算法 编译器
【C语言】qsort()函数详解:能给万物排序的神奇函数
【C语言】qsort()函数详解:能给万物排序的神奇函数
41 0
|
1月前
|
搜索推荐 算法 C语言
C语言实现冒泡排序算法
C语言实现冒泡排序算法
18 0
|
1月前
|
算法 C语言
用冒泡排序模拟C语言中的内置快排函数qsort!
用冒泡排序模拟C语言中的内置快排函数qsort!
|
1月前
|
搜索推荐 C语言 索引
【C语言】剖析qsort函数的实现原理
【C语言】剖析qsort函数的实现原理
27 0
|
1月前
|
搜索推荐 C语言
冒泡排序C语言,小白必看!只需1秒便可开挂
冒泡排序C语言,小白必看!只需1秒便可开挂
|
1月前
|
搜索推荐 算法 C语言
C语言实现冒泡排序
C语言实现冒泡排序
21 0