冒泡实现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


相关文章
用冒泡模拟qsort的实现
用冒泡模拟qsort的实现
50 0
|
C语言
妙用指针实现qsort
妙用指针实现qsort
94 0
【C】回调函数和qsort详解
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或 条件进行响应。
|
9月前
|
C语言
qsort函数排序+冒泡模拟实现
qsort函数排序+冒泡模拟实现
|
算法 搜索推荐
交换排序--冒泡
交换排序--冒泡
47 0
|
搜索推荐 C语言
【C语言】“qsort函数详解”与“使用冒泡思想模拟使用qsort”
qsort的介绍: qsort ()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中 此函数需要四个参数void qsort(void* *base, size_t nitems, size_t size, int (compar)(const void * , const void)) char* base —— 指向要排序的数组首元素地址的指针 size_t nitems —— 要排序数组的元素个数 size_t size —— 数组每个元素大的小 (有非常重要的作用) int compar(const void *,const void *) —— 由使用者提供的一
数据结构题:由逆置数组方法——逆置线性表L的所有元素
数据结构题:由逆置数组方法——逆置线性表L的所有元素
数据结构题:由逆置数组方法——逆置线性表L的所有元素
|
人工智能 算法 搜索推荐
wikioi 1076 排序 【这里含冒泡、选择、插入以及快排库函数的调用】
/*=================================================================== 1076 排序 题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description...
705 0
回调函数与qsort函数
回调函数与qsort函数
51 0

热门文章

最新文章