用冒泡实现各种数据的排序(qsort函数的模拟实现)

简介: 用冒泡实现各种数据的排序(qsort函数的模拟实现)


 qsort函数的介绍与使用已在前面博客写过:函数 qsort 详解 ,这篇博客我们用冒泡排序模拟实现一下qsort函数。

首先我们实现一个冒泡排序的函数

void Bubblesort(int* a, int sz)//sz为数组元素个数 
{
  int i = 0, j = 0,tmp;
  for (j = 0; j < sz; j++)
  {
    for (i = 0; i < sz - 1 - j; i++)
    {
      if (a[i] > a[i + 1])
      {
        tmp = a[i];
        a[i] = a[i + 1];
        a[i + 1] = tmp;
      }
    }
  }
}

我们用冒泡排序的方式实现qsort

void Swap(char*x,char*y,int sz)
{
  int i = 0;
  char tmp = 0;
  for (int i = 0; i < sz2; i++)
  {
    tmp = *x;
    *x = *y;
    *y = tmp;
    y++;
    x++;
  }
}
void Bubblesort(void*a,int sz1,int sz2,int (*compare)(const void *x,const void*y ))
{
  char* b = (char*)a;
  for (int j = 0; j < sz1; j++)
  {
    for (int i = 0; i < sz1 - 1 - j; i++)
    {
      int flag = compare(b + (i * sz2), b + ((i + 1) * sz2));
      if (flag<0)
      {
        Swap(b + (i * sz2), b + ((i + 1) * sz2),sz2);
      }
    }
  }
}

我们先看一下Bubblesort函数

void Bubblesort(void*base,int sz1,int sz2,int (*compare)(const void *x,const void*y ))

它有四个参数

  • base-- 指向要排序的数组的第一个元素的指针。
  • sz1 -- 由 base 指向的数组中元素的个数。
  • sz2 -- 数组中每个元素的大小,以字节为单位。
  • compare -- 函数指针,用来接受比较两个元素的函数,该函数使用者自己实现。

尤其需要注意的是第四个参数,compare,它是需要根据数组中元素不同类型单另实现的函数。

我们在看一下Swap函数

void Swap(char*x,char*y,int sz)

x,y是用来接收要被比较的两个数的地址,sz是数据的大小,单位为字节。

下来我们看一下compare函数的实现

int compare (const void *x,const void*y )

参数只有两个,x和y,要比较的两个数据的地址

排整型和浮点型

int compare(const void* x, const void* y)
{
  return *(int*)x - *(int*)y;
}

排字符串

int compare(const void* x, const void* y)
{
  strcmp((char*)x, (char*)y);
}

对结构体数组排序其实也是对以上三种类型的排序。

建立一个结构体

struct stu 
{
  char name[20];
  int age;
};

按名字排序

int cmp_stu_age(const void* x, const void* y)
{
  strcmp(((struct stu*) x)->name , ((struct stu*)y)->name);
}

按年龄排序

int cmp_stu_age(const void* x, const void* y)
{
  return  (((struct stu*) x)->age- ((struct stu*)y)->age);
}


相关文章
|
6月前
|
搜索推荐 C语言
模拟实现qsort函数:冒泡排序详解
模拟实现qsort函数:冒泡排序详解
39 1
|
7月前
|
C语言
qsort函数排序+冒泡模拟实现
qsort函数排序+冒泡模拟实现
用冒泡模拟qsort的实现
用冒泡模拟qsort的实现
38 0
|
程序员
qsort函数的模拟实现
qsort函数的模拟实现
55 1
|
搜索推荐
深入探究常用排序算法:冒泡、插入、选择与快速排序
深入探究常用排序算法:冒泡、插入、选择与快速排序
|
C语言
qsort函数的使用和模拟实现
qsort函数的使用和模拟实现
65 0
qsort函数的使用和模拟实现
|
算法
算法排序选择冒泡
算法排序选择冒泡
56 0
|
搜索推荐
qsort函数的应用以及模拟实现
qsort函数的应用以及模拟实现
86 0
|
C语言 C++
冒泡排序模拟qsort函数
冒泡排序模拟qsort函数
114 0
冒泡排序模拟qsort函数
|
C语言
“冒泡”排序
“冒泡”排序