Day_14 > 指针进阶(3)> bubble函数

简介: Day_14 > 指针进阶(3)> bubble函数

今天我们继续深入学习指针

1.回顾回调函数

我们回顾一下之前学过的回调函数

回调函数就是一个通过函数指针调用的函数

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外 的一方调用的,用于对该事件或条件进行响应

2.写一个bubble_sort函数

2.1认识一下qsort函数

同样,我们在cplusplus网站里学习一下

qsort - C++ Reference (cplusplus.com)

2.2写bubble_sort函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void qsort
//qsort底层使用的是快速排序
(
  void* base,//指向待排序数据的起始地址
  size_t num,//待排序数据的元素个数
  size_t size,//待排序数据的一个元素的大小,单位是字节
  int(*cmp)(const void* e1, const void* e2)//函数指针,指向一个比较函数,这个函数是用来比较2个元素的
);
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
struct Stu
{
  char name[20];
  int age;
};
int cmp_by_age(const void* e1, const void* e2)
{
  return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_by_name(const void* e1, const void* e2)
{
  return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
void swap(char* buf1, char* buf2, size_t size)
{
  int i = 0;
  for (i = 0; i < size; i++)
  {
    char tmp = *buf1;
    *buf1 = *buf2;
    *buf2 = tmp;
    buf1++;
    buf2++;
  }
}
//使用冒泡排序的算法,模拟实现一个排序函数,可以排序任意类型的数据
//bubble_sort()
void bubble_sort(void* arr,size_t sz,size_t size, int(*cmp)(const void* e1, const void* e2))
{
  //冒泡排序的趟数
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
    //一趟冒泡排序
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (cmp((char*)arr+j*size,(char*)arr+(j+1)*size)>0)
      {
        swap((char*)arr + j * size, (char*)arr + (j + 1) * size,size);
      }
    }
  }
}
//int(*cmp)(const void* e1, const void* e2)
  //e1是一个指针,存放了要比较的一个元素的地址
  //e2是一个指针,存放了要比较的一个元素的地址
  //e1指向的元素大于e2指向的元素,返回一个>0的数字
  //e1指向的元素等于e2指向的元素,返回0
  //e1指向的元素小于e2指向的元素,返回一个<0的数字
void print_arr(int arr[], int sz)
{
  for (int i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
void test1()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序
  //排序为升序
  int sz = sizeof(arr) / sizeof(arr[0]);
  print_arr(arr, sz);
  bubble_sort(arr, sz,sizeof(arr[0]),cmp_int);
  print_arr(arr, sz);
}
void test2()
{
  struct Stu arr[] = { { "zhangsan",20 } ,{ "lisi", 18 }, { "wangwu", 12 } };
  int sz = sizeof(arr) / sizeof(arr[0]);
  bubble_sort(arr, sz, sizeof(arr[0]),cmp_by_age);
  bubble_sort(arr, sz, sizeof(arr[0]), cmp_by_name);
}
int main()
{
  //test1();//测试排序整型数据
  test2();//测试排序结构体数据
  return 0;
}

这里我们写的bubble_sort函数是升序的排序,具体的实现细节,我们后面的文章会分析

相关文章
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
7月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
3月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
3月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
3月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
23 1
|
3月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
30 2
|
4月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
5月前
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
82 9
|
5月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
7月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)

热门文章

最新文章