冒泡排序实现快速排序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,就是总趟数,还有一个是每个元素要比较的次数,这个和冒泡排序是一样的。  



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

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

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

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

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

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

下期见哈!!!

相关文章
|
3月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
74 4
|
4月前
|
算法 搜索推荐 C语言
【C语言】冒泡排序+优化版
【C语言】冒泡排序+优化版
|
4月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
31 2
|
4月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
48 0
|
4月前
|
搜索推荐 C语言
深入浅出理解 C 语言中的 qsort 函数
深入浅出理解 C 语言中的 qsort 函数
|
4月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
7月前
|
搜索推荐 C语言
C语言冒泡排序(附源码和动态图)
冒泡排序是一种简单的排序算法,其基本思想是通过重复遍历待排序的数列,比较每对相邻元素的值,如果它们的顺序错误(即满足一定的排序条件,如从小到大排序时前一个元素大于后一个元素),就交换它们的位置。这个过程就像水底的气泡一样逐渐向上冒,因此得名“冒泡排序”。
146 1
|
8月前
|
搜索推荐 C语言
c语言qsort函数的模拟实现
c语言qsort函数的模拟实现
36 1
|
8月前
|
算法 搜索推荐 C语言
C语言冒泡排序介绍
C语言冒泡排序介绍
|
8月前
|
C语言
【C语言】: 快速排序——qsort函数的介绍
【C语言】: 快速排序——qsort函数的介绍
65 0

热门文章

最新文章