qsort函数在冒泡排序中的应用

qsort函数在冒泡排序中的应用


冒泡排序

#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
	int temp;//用于交换中间变量
	for (int i = 0;i < sz - 1;i++)
	{
		for (int j = 0;j < sz - i - 1;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
void Print(int arr[], int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 0,6,7,8,9,1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);//升序
	Print(arr, sz);//打印
	return 0;
}

qsot函数的用法

  在MSDN中qsot函数是这样定义的,

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

  对于qsot函数,它可以实现不同类型的排序,第一个参数类型是void*,无具体类型的指针,保证传进去的参数无论是什么类型,qsot函数都可以接收,但是因为是无类型,所以不能进行加减运算,也不能进行解引用。
qsot函数各个参数的意义:
  qsot函数第一个函数参数void *base:待排序数组的头指针
  qsot函数第二个函数参数size_t num:待排序数组的元素个数
  qsot函数第三个函数参数size_t num:元素的大小,单位是字节
  qsot函数第四个函数参数int (__cdecl *compare)(const void *elem1, const void *elem2):元素排序的方法,即排序时用来比较两个元素的函数,类型是函数指针(例如结构体数组,字符串数组的比较)。
  qsot函数使用需要引用的头文件是<stdlib.h>

冒泡排序中的qsort

#include <stdio.h>
#include <stdlib.h>
int com(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;//强制类型转换后解引用
}
void Print(int arr[], int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 0,6,7,8,9,1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,sz,sizeof(arr[0]),com);
	Print(arr, sz);//打印
	return 0;
}

  在这里,确定比较关系的函数com具有特定的要求,当e1小于e2时,返回小于0的数,当e1等于e2时,返回0,当e1大于e2时,返回大于0的数;此时只需要返回e1-e2即可,e1和e2都是无类型的参数指针,需要强制类型转换成int*,然后在解引用,这样得到的结果是一个升序排列的数组0 1 2 3 4 5 6 7 8 9。
  如果我们想改变排序方式为降序,只需要调换e1-e2为e2-e1,如此便是一个降序的数组。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
	char name[20];
	int age;
};
int com(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
	//return (struct stu*)e1)->age -((struct stu*)e2)->age;通过年龄排列
}
void Print(struct stu* s, int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%s %d",s[i].name, s[i].age);
		printf("\n");
	}
}
int main()//给结构体数组赋值
{
	struct stu s[3] = { {"张三",20},{"李四",33},{"王五",28} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), com);
	Print(s, sz);
	return 0;
}

  这里时对结构体数组进行排列,分别通过名字顺序和年龄大小排列。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值