C语言实现冒泡排序排列数组中的元素!

这篇具有很好参考价值的文章主要介绍了C语言实现冒泡排序排列数组中的元素!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先画图理解一下冒泡排序的思想:

C语言实现冒泡排序排列数组中的元素!,C语言学习记录,c语言,算法,数据结构,开发语言,c#,学习,排序算法

 按照图中的方法来编写程序:

 冒泡排序函数
void maopao(int arr[], int sz)
{
	int i = 0;
	//循环的趟数
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;

		// 1趟的循环(比较相邻的数大小排序)
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}

	}
}

// 打印数组函数
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);


	print(arr, sz);  // 调用打印数组函数
	maopao(arr, sz); //调用冒泡排序函数
	print(arr, sz); // 调用打印数组函数


	return 0;
}

自己写完了,发现有一个库函数qsort()也是用来排序的函数,接着学习一下吧:

此库函数需要四个参数:

1、void* base,    //base中存放的是待排序数据中第一个对象的地址

2、size_t num,    // 待排序数据元素的个数

3、size_t width,    // 待排序数据中一个元素的大小,单位是字节

4、int(__cdecl* compare)(const void* elem1, const void* elem2) // 函数指针  用来比较待排序数据中心的2个元素的函数

C语言实现冒泡排序排列数组中的元素!,C语言学习记录,c语言,算法,数据结构,开发语言,c#,学习,排序算法

 接下来就是代码实现了:

#include<stdio.h>
#include<stdlib.h>

// 两个元素的比较函数
int* compare(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;    //返回第一个强制转换成整形指针类型的指针解引用 减去 第二个额强制转换成整型指针类型的指针解引用
}

// 打印数组函数
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	print(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), compare);
	print(arr, sz);

	return 0;
}

接下来用qsort()库函数排序自己写的结构体排序:

C语言实现冒泡排序排列数组中的元素!,C语言学习记录,c语言,算法,数据结构,开发语言,c#,学习,排序算法

#include<stdio.h>

struct STU
{
	char name[30];
	int age;
};

int sort_age(const void* elem1, const void* elem2)
{
	return ((struct STU*)elem1)->age - ((struct STU*)elem2)->age;
}

int sort_name(const void* elem1, const void* elem2)
{
	return strcmp(((struct STU*)elem1)->name , ((struct STU*)elem2)->name);
}

int main()
{
	struct STU s[] = {{"环环", 25},{"峰峰", 20},{"花花", 18}};
	int sz = sizeof(s) / sizeof(s[0]);

	//按照年龄来排序
	//qsort(s, sz, sizeof(s[0]), sort_age);

	//按照名字来排序
	qsort(s, sz, sizeof(s[0]), sort_name);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d \n", s[i], s[i].age);
	}

	return 0;
}

qsort()库函数就是一个全能型的排序函数。接下来就要我们自己手写一个qsort()函数了,看代码:

#include<string.h>
#include<stdio.h>
//模拟qsort()冒泡排序
void jiaohuan(char* p1, char* p2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}


void maopao(void* star, 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*)star + j * width, (char*)star + (j + 1) * width) > 0)
			{
				jiaohuan((char*)star + j * width, (char*)star + (j + 1) * width, width);
			}
		}
	}

}

以上两个函数就实现了qsort()库函数的全部功能,接下来就是利用自己手写的函数来排序结构体数据了。还是看代码吧:文章来源地址https://www.toymoban.com/news/detail-613129.html

#include<string.h>
#include<stdio.h>
//模拟qsort()冒泡排序

// 交换函数  一个字节一个字节的交换  交换的宽度为传过来的数据的宽度
void jiaohuan(char* p1, char* p2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
        //一个字节一个字节的交换
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

// 冒泡排序函数
void maopao(void* star, 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(回调函数的结果  大于 零) 回调函数就是比较两个指针中值的大小
			if (cmp((char*)star + j * width, (char*)star + (j + 1) * width) > 0)
			{
                // 调用交换函数(传入要调换的两个数的指针和数据宽度)
				jiaohuan((char*)star + j * width, (char*)star + (j + 1) * width, width);
			}
		}
	}

}

//创建结构体
struct STU
{
	char name[20];
	int age;
};


// 打印函数
void print(struct STU s[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s:%d ", s[i].name, s[i].age);
	}
	printf("\n");
}


// 比较姓名的回调函数(想要降序排列就把return后面的e1和e2对调)
int sort_name(const void* e1, const void* e2)
{
	return strcmp(((struct STU*)e1)->name, ((struct STU*)e2)->name);

}

// 比较年龄的回调函数(想要降序排列就把return后面的e1和e2对调)
int sort_age(const void* e1, const void* e2)
{
    // 把e2强制转换成结构体指针类型再强制转换成整型指针类型
	return (int*)((struct STU*)e2)->age - (int*)((struct STU*)e1)->age;
}

//主函数
int main()
{
	struct STU s[] = { {"张强",46},{"小李",38},{"芳华",56} ,{"郭华",16} };//初始化结构体
	int sz = sizeof(s) / sizeof(s[0]);  //计算结构体的字节数

	print(s, sz);  //调用打印函数
	//maopao(s, sz, sizeof(s[0]), sort_name); // 按姓名排序结构体
	maopao(s, sz, sizeof(s[0]), sort_age);  //按年龄排序结构体
	print(s, sz);  //调用打印函数
	return 0;
}

到了这里,关于C语言实现冒泡排序排列数组中的元素!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言学习记录——找数组中的鞍点

    目录 C语言中 鞍点的定义  代码的实现 思路分析图解  指一个矩阵中,即该位置上的元素在该行上最大,在该列上最小。 一个二维数组可能没有鞍点。 例如:1,2,3            4,5,6            7,8,9 该矩阵中,鞍点为3所在的位置。 即数组坐标[ 0 ] [ 2 ],在第一行第三

    2024年02月04日
    浏览(40)
  • C语言经典算法实例3:数组元素排序

    求数组的排序 问题的描述 如下几点所示 使用rand()库函数随机生成10个1-100之间的数字。 声明数组的大小为10。 随机生成的10个数字赋值给数组。 给数组内的元素由小到大排序。 本文C语言经典算法实例的编译环境,使用的是集成开发环境:Visual Studio 2019 Visual Studio 2019官网链

    2024年02月01日
    浏览(41)
  • Java 语言实现冒泡排序

    冒泡排序是一种简单直观的排序算法,它重复地比较相邻的两个元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。冒泡排序的思路是通过每一轮的比较将最大(或最小)的元素逐渐“冒泡”到数组的最后,并将其固定在正确的位置上。 Java作为一种高级语言,

    2024年02月10日
    浏览(44)
  • 【排序算法】C语言实现选择排序与冒泡排序

    这里是阿辉算法与数据结构专栏的第一篇文章,咱们就从排序算法开始讲起,排序算法有很多大致分为两类:基于比较的排序和非比较的排序 基于比较的排序:冒泡、选择、插入、希尔、堆、归并、随机快排 非比较的排序:桶排序 以上的排序算法阿辉都会讲到,今天阿辉主

    2024年02月04日
    浏览(43)
  • C语言算法——实现冒泡排序

    默认数组中的第一个数是原本数组中排好序的第一个数,然后每次将排好序的数组的后面的第一个数作为哨兵。每次哨兵都和前面的排好序的数组中的数从后往前进行比较,然后将哨兵插入到已经排好序的数组中。然后哨兵逐渐往后移动,逐步将哨兵插入到数组中,这就是

    2024年02月04日
    浏览(49)
  • c语言用冒泡排序模拟实现qsort排序

    1、简单介绍冒泡排序 冒泡排序就是两两相邻元素进行比较,如果不满足顺序就进行交换。现有一组整数,将其用冒泡排序实现排序为升序。 假设有这样一组整数:9 8 7 6 5    由此可知,如果一个整型数组有num个元素,则需走num-1趟,若走在第i趟,则在第i趟内需要比较num-1

    2024年02月15日
    浏览(47)
  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

    2024年02月13日
    浏览(42)
  • Go 语言实现冒泡排序算法的简单示例

    以下是使用 Go 语言实现冒泡排序算法的简单示例: 在这个例子中, bubbleSort 函数接收一个整数切片,对切片中的元素进行冒泡排序。在 main 函数中,我们定义了一个示例数组,调用 bubbleSort 函数对其进行排序,并输出结果。 注意,冒泡排序算法的时间复杂度为 O(n^2),因此对

    2024年01月23日
    浏览(46)
  • 【Java】使用 Java 语言实现一个冒泡排序

    大家好,我是全栈小5,欢迎阅读小5的系列文章。 这是《Java》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平

    2024年03月22日
    浏览(42)
  • 数据结构——C语言实现常见排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序)

    现在是北京时间2023年6月23日13点19分,度过了一个非常愉快的端午节。由于刚从学校回家,一下子伙食强度直升了个两三个档次。这也导致我的肠胃不堪重负,我也准备等会去健身房消耗一下盈余的热量。回到家陪伴爷爷走人生最后的阶段才是我这个暑假最重要的事情。自从

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包