首页 > 编程语言 >C语言—模范qsort()实现一个冒泡排序的通用算法

C语言—模范qsort()实现一个冒泡排序的通用算法

时间:2023-03-27 15:32:45浏览次数:42  
标签:sz arr int void qsort 冒泡排序 C语言 char width


目录

一、库方法qsort参数解释

二、冒泡排序解释

三、模拟实现

1、冒泡排序函数

2、数值交换函数

3、测试函数

4、运行结果

5、源代码


一、库方法qsort参数解释

C语言—模范qsort()实现一个冒泡排序的通用算法_算法

二、冒泡排序解释

C语言—模范qsort()实现一个冒泡排序的通用算法_学习_02

三、模拟实现

1、冒泡排序函数

void bubble_sort(void* base, 
				int sz, 
				int width,
				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*)base+j*width,(char*)base + (j+1) * width) > 0) {
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

2、数值交换函数

交换方式:以字节为单位,一个字节一个字节交换

//满足条件,交换两值
void Swap(char* buff1,char* buff2,int width) {
	int i = 0;
	for (i = 0; i < width; i++) {
		char tmp = *buff1;
		*buff1 = *buff2;
		*buff2 = tmp;
		buff1++;
		buff2++;
	}
}

3、测试函数

//int型的两数比较
int cmp_int(const void* e1, const void* e2) {
	return *(int*)e1 - *(int*)e2;
}
print_arr(int arr[],int sz) {
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%d ",arr[i]);
	}
	printf("\n");
}
void test() {
	//整型数组排序
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("排序前:");
	print_arr(arr, sz);
	//排序
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	printf("排序后:");
	print_arr(arr,sz);

}
int main() {
	test();
	return 0;
}

4、运行结果

C语言—模范qsort()实现一个冒泡排序的通用算法_算法_03

5、源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>


//用库方法qsort()的方式,实现冒泡排序的通用算法

//满足条件,交换两值
void Swap(char* buff1,char* buff2,int width) {
	int i = 0;
	for (i = 0; i < width; i++) {
		char tmp = *buff1;
		*buff1 = *buff2;
		*buff2 = tmp;
		buff1++;
		buff2++;
	}
}

void bubble_sort(void* base, 
				int sz, 
				int width,
				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*)base+j*width,(char*)base + (j+1) * width) > 0) {
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

//测试
//int型的两数比较
int cmp_int(const void* e1, const void* e2) {
	return *(int*)e1 - *(int*)e2;
}

//打印arr
print_arr(int arr[],int sz) {
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%d ",arr[i]);
	}
	printf("\n");
}
void test() {
	//整型数组排序
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("排序前:");
	print_arr(arr, sz);
	//排序
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	printf("排序后:");
	print_arr(arr,sz);

}

int main() {
	test();
	return 0;
}

标签:sz,arr,int,void,qsort,冒泡排序,C语言,char,width
From: https://blog.51cto.com/qiux/6152251

相关文章

  • C语言—字符函数和字符串函数解析及其模拟实现
    目录一、求字符串的长度1、strlen()-字符串长度二、长度不受限制的字符串函数1、strcpy()-字符串拷贝2、strcat()-字符串追加3、strcmp()-字符串比较三、长度受限制的字符串函数1、s......
  • C语言 | C语言中的四种特殊函数
    目录1.递归函数2.变参函数3.回调函数4.内联函数5.拓展1.递归函数与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段。递推阶段-......
  • C语言学习记录(七)
    C语言学习记录(七)一、知识要点(函数)一、函数的作用在一个应用程序中的若干个功能相互独立,可单独操作的程序单元叫做模块。在C语言中用函数实现模块的功能,将这些模块构成......
  • C语言复习(四)
    第三章:最简单的程序设计——顺序结构设计3.1顺序程序设计举例3.2数据的表现形式及其自复查UN常量运算3.2.1常量和变量常量: 整形常量、实型常量  、字符常量{字符常......
  • 用冒泡排序法实现多种类型的数据排序
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>voidswap(char*buf1,char*buf2,intwidth){ inti=0; for(i=0;i<width;i++)//实现每个字节的交换,......
  • 用C语言实现ElGamal算法
    缘起是我侄子问的题目,参考了书籍、博客,花了一些时间完成的,丢掉可惜了,记录下来吧。这个程序还有些缺陷,数值太大时计算结果会溢出代码#include<stdio.h>#include<time.h>......
  • c语言当中while的条件为指针
    做第一个笔记记录一种是while(指针变量)/*char*str="string";while(*str){...(省略)str++;}*/while(*str) 的作用等同于 while(*str!=‘\0’)即就是当*s......
  • C语言去掉不是尾部*的全部*
    #include<stdio.h>voidfun(char*a,char*p){char*t=a;for(;t<=p;t++)if(*t!='*')*(a++)=*t;for(;*t!='\0';t++)*(a++)=*t;*a=......
  • 万能的排序“qsort”
    今日份学习“qsort”函数前言:针对一个数组的元素进行排序,我们可以想到冒泡排序法,且如果将该排序法专门写入一个函数,需排序的数组调入其中是不是方便很多呢?且如果要实现这样......
  • 算法分析与设计——冒泡排序,选择排序,STL自带sort函数性能比较实验
    实验环境:Win11,Devc++5.11实验方法:生成不同数据量的随机数后使用三种排序方法分别排序,比较每种方法所耗时长。实验结果:数据量为1000时,冒泡排序平均用时为0.015s,选择排序平......