模仿 qsort 的功能实现一个通用的冒泡排序

模仿 qsort 的功能实现一个通用的冒泡排序

 

 

#define _CRT_SECURE_NO_WARNINGS 1

 

#include

#include

int cmp(const void *m, const void *n)

{

return *(char *)m - *(char *)n;

}

void swap(char *p1,char *p2,int width)

{

int i = 0;

char temp;

for (; i < width; i++)

{

temp = *p1;

*p1 = *p2;

*p2 = temp;

*p1++;

*p2++;

}

 

}

void my_qsort(void *base, int size, int width)

{

int i = 0;

int j = 0;

int ret = 0;

for (i = 0; i < size; i++)

{

j = 0;

for (j = 0; j < size - i - 1; j++)

{

ret = cmp((char*)base + j*width, (char*)base + (j + 1)*width);

if (ret>0)

{

swap((char*)base + j*width, (char*)base + (j + 1)*width, width);

}

}

}

}

 

int main()

{

int i = 0;

int a[] = { 5, 4, 3, 2, 1 };

char b[] = { 's', 'm', 'l', 'z', 'h' };

//定义两种类型的数据用同一个函数对两组数据进行冒泡排序

my_qsort(a, 5, 4);

for (i = 0; i < 5; i++)

{

printf("%d\n", a[i]);

}

printf("\n");

my_qsort(b, 5, 1);

for (i = 0; i < 5; i++)

{

printf("%c\n", b[i]);

}

printf("\n");

system("pause");

return 0;

 

}

 

这个程序的核心就是my_qsort函数

void my_qsort(void *base, int size, int width)

{

int i = 0;

int j = 0;

int ret = 0;

for (i = 0; i < size; i++)

{

j = 0;

for (j = 0; j < size - i - 1; j++)

{

ret = cmp((char*)base + j*width, (char*)base + (j + 1)*width);

if (ret>0)

{

swap((char*)base + j*width, (char*)base + (j + 1)*width, width);

}

}

}

}

 

在编写这个函数的的时候首先要考虑的就是和之前的冒泡排序的不同点,那就是现在所要处理的不同的数据类型,要面对不同的数据类型都能比较都能进行交换的话,所以对数据进行操作的时候是需要按字节来操作的,所以这个函数需要传入的参数为,需要传入要进行冒泡排序的数据集合,也就是各种类型数组的指针,之后就是需要进行排序的数组个数,再还需要一个参数就是类型宽度,也就是当前数据类型的每一个数据的长度。

  之后就是两个数据进行比较的函数,

int cmp(const void *m, const void *n)

{

return *(char *)m - *(char *)n;

}

这里函数和之前所写的qsort函数是相同的,并没有什么差别。

之后就是两个数据交换的函数。

void swap(char *p1,char *p2,int width)

{

int i = 0;

char temp;

for (; i < width; i++)

{

temp = *p1;

*p1 = *p2;

*p2 = temp;

*p1++;

*p2++;

}

 

}

通常我们在对数据进行交换的时候,直接定义相同类型的中间变量进行交换即可,但是这里不同的数据就需要定义不同类型的中间变量所以就需要对字节进行操作,但是每个数据类型要操作的字节长度都不一样,所以在交换函数中需要传入你当前数据类型的长度width,然后用for循环每次只操作一个字节。每次往后移动一个字节就可以。

 这样就可以对不同的数据进行冒泡排序。

模仿 qsort 的功能实现一个通用的冒泡排序_第1张图片

你可能感兴趣的:(c语言基础,个人总结)