优化冒泡排序!

本文介绍了冒泡排序的基本思想和简单实现,通过C语言展示了整数数组的冒泡排序过程。接着,文章探讨了C语言标准库中的qsort函数,解释了其工作原理,并提供了如何利用qsort对整型数据和结构体数据进行排序的示例。通过优化冒泡排序,提高了排序效率。
摘要由CSDN通过智能技术生成

冒泡排序思想

冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
基本思想:
对于一组待排序的元素,依次比较两个相邻的数,将比较小的数放在前面,比较大的放在后面,重复步骤,到排序完成。
本文,将对冒泡排序进行一些改进,以及不仅仅是去排序整数
在这里插入图片描述


一、简单实现冒泡排序

先来看下面这个对整数的排序(升序):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//冒泡排序
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//假设数组是已经排好序
		//一趟冒泡排序的过程
		int j = 0;
		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;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}
int main()
{
	int arr[] = { 5,9,7,1,0,4,3,2,6,8 };
	//把数组排成升序  0 1 2 3 4 5 6 7 8 9
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

测试运行结果:
在这里插入图片描述
可以看到成功的将这组元素进行了排序,但是我们发现它好像只能进行整型数据的排序,我们该如何去优化呢?这里引出c语言库函数qsort

二、qsort函数

1.qsort函数是基于快速排序算法实现的一种排序函数

我们来看一下它的函数原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

这里我将它简化一下便于理解

void qsort(void* base, //要排序的数据的起始位置
size_t num, //待排序的数据元素个数
size_width, //待排序的数据元素的大小(字节)
int(cmp)(const void e1,const void* e2)); //函数指针–>比较函数

2.使用qsort函数优化冒泡排序

①对整型元素的优化排序

代码如下(示例1):

#include <stdio.h>
#include <string.h>
//比较两个整型元素
int cmp_int(const void* e1, const void* e2) //void *指针不能直接进行解引用操作
{
	
	/*if (*(int*)e1 > *(int*)e2)  //compare  比较
		return 1;
	else if (*(int*)e1 == *(int*)e2)
		return 0;
	else
		return -1;*/
	return (*(int*)e1 - *(int*)e2);
}
 //整型排序
void test1()
{
	int arr[] = { 5,9,7,1,0,4,3,2,6,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);//数组名代表首元素地址
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()

{
	test1();
	return 0;
}

测试运行结果:
在这里插入图片描述

这里我要补充一下
void* pf = &a;
void 无具体类型的指针,可以接收任意类型的地址
void
不能解引用操作,也不能+ -整数

②对结构数据的排序

代码如下(示例2):

#include <stdio.h>
#include <string.h>

struct Stu
{
	char name[20];
	int age;
};
int cmp_stu_byname(const void* e1, const void* e2)
{	
	//strcmp  --> >0 ==0  <0
	//e1,e2的类型变为结构体类型的指针
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_stu_byage(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void test2() 
{
	//测试使用qsort排序结构数据
	struct Stu s[] = { {"zhangsan",15},{"lisi",30},{"wangwu",25} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_byname);
	
	//打印...
}

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

我们通过对名字来排序,实际上是使用strcmp来对两个字符串进行比较。
测试结果:
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FIRM'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值