冒泡实现qsort

简介: 冒泡算法 qsort函数

 目录

冒泡算法介绍

回调函数

实现


冒泡算法介绍

       冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法

       它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

       这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

在我们用冒泡算法实现qsort函数时还用到了回调函数,下面我们介绍一下回调函数:

回调函数

       回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。

       回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。

       最著名的回调函数调用有C/C++标准库stdlib.h/cstdlib中的快速排序函数qsort和二分查找函数bsearch中都会要求的一个与strcmp类似的参数,用于设置数据的比较方法。

实现

首先演示一下qsort函数使用:

#include<stdio.h>
#include<stdlib.h>
//qsort函数的使用者得实现一个比较函数
int int_cmp(const void *p1, const void *p2)
{
  return (*(int *)p1 - *(int *)p2);
}
int main()
{
  int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
  int i = 0;
  //void qsort( void *base, size_t num, size_t width, 
  //      int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
  return 0;
}

image.gif

冒泡函数实现qsort函数:

#include<stdio.h>
#include<string.h>
//实现字符串比较函数
int int_str(const void * p1, const void *p2)
{
  return strcmp(*(char **)p1,*(char **)p2);
}
//实现整数比较函数
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 )(const void *,const void *))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < count-1; i++)
  {
    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[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
  char *arr[] = {"aaaa","dddd","cccc","Bbbb"};
  int i = 0;
  bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_str);
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%s ", arr[i]);
  }
  printf("\n");
  return 0;
}

image.gif


相关文章
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的共享单车数据存储系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的共享单车数据存储系统附带文章源码部署视频讲解等
134 1
|
前端开发 Java 应用服务中间件
Spring Boot自动配置详解
Spring Boot自动配置详解
|
10月前
|
安全 网络安全 网络虚拟化
100个网络技术中英文术语,收藏收藏!
【10月更文挑战第22天】
1143 5
100个网络技术中英文术语,收藏收藏!
|
消息中间件 中间件 Kafka
中间件解耦与松耦合
【6月更文挑战第19天】
317 3
|
安全 Java API
Java Stream流生成从指定日期到当前日期的所有日期/时间范围
Java Stream流生成从指定日期到当前日期的所有日期/时间范围
|
设计模式 Kubernetes Cloud Native
Kubernetes 中 4 种容器设计模式
Kubernetes 中 4 种容器设计模式
Kubernetes 中 4 种容器设计模式
|
Linux C++ Windows
基于Asio库的定时器,封装实现好用的定时任务
基于Asio库的定时器,封装实现好用的定时任务
|
存储 移动开发 NoSQL
Redis到底是什么?都有哪些特性?看完这一篇就都会了
Redis到底是什么?都有哪些特性?看完这一篇就都会了
675 1
|
安全
视频|年最新免费注册MicroSoft365的方法!保姆级教程!!
我们平常说的版本,如:2013、2016等,是那个年份前后推出的office办公套件,我们购买(激活)后,就只能一直使用那个版本,如果想升级新版本,可能需要重新购买(激活)。
715 0