模拟实现冒泡排序(全类型数据交换)

目录

1.普通整形冒泡排序解析和模拟实现

1.1冒泡排序思想图解

1.2冒泡排序代码实现

 2.全类型冒泡排序解析和模拟实现

2.1全数据类型冒图解

2.2全数据类型冒泡排序代码实现


1.普通整形冒泡排序解析和模拟实现

1.1冒泡排序思想图解

1.2冒泡排序代码实现

#include<stdio.h>


void bubble(int* arr, int num)
{
	int flag = 0;
	for (int i = 0; i < num - 1; i++)//排10个数需要9趟,排n个数就是n-1趟
	{
		//一趟内部比较
		flag = 0;
		for (int j = 0; j < num - 1 - i; j++)
   //每次循环一次,最末尾的i+1个数已经排好了,这里-1是为了防止越界比较
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 1;
			}
			if (flag == 0) //如果一趟内部都没有一次交换行为,代表已经有序
				break;
		}
	}
}


int main()
{
    int arr[11] = { 3,1,5,7,8,6,2,4,9,0,11 };
    bubble(arr, sizeof(arr) / sizeof(arr[0]));
    for (int i = 0; i < 11; i++)
	{	
		printf("%d ", arr[i]);
	}
    
    return 0;
}

 2.全类型冒泡排序解析和模拟实现

2.1全数据类型冒图解

 

2.2全数据类型冒泡排序代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct stu {
	char name[20];
	int age;
}stu;


int asc_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

void Swap(char*  p1,char* p2,int size)
{
	//assert(p1 && p2);
	while (size--)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}

}

//ptr 指向需要排序的对象或数组
//num 对象或者数组的元素总数 
//size 一个元素大小
//cmp  比较方法
void bublle_qsort(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*))
{
	int flag = 0;
	for (int i = 0; i < num -1; i++)//排10个数需要9趟,排n个数就是n-1趟
	{

		for (int j = 0; j < num - 1 - i; j++)//每次循环一次,最末尾的i+1个数已经排好了,这里-1也是为了防止越界比较
		{
			//假设需要升序cmp返回 >0 交换。
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//2个元素比较,需要传两个相邻元素的地址。
			{
				//交换
				Swap((char*)base + (j * size), (char*)base + ((j + 1) * size), size);

			}
		}
	}
}


int stuby_name(const void* p1, const void* p2)
{
	return  strcmp(((stu*)p1)->name, ((stu*)p2)->name);
}


int stuby_age(const void* p1, const void* p2)
{
	return  ((stu*)p1)->age - ((stu*)p2)->age;
}

int main()
{
	stu starr[3] = { {"张三",35},{"王五",29},{"李四",18} };
	int arr[11] = { 3,1,5,7,8,6,2,4,9,0,11 };

	bublle_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), asc_int);

	for (int i = 0; i < 11; i++)
	{
		printf("%d ", arr[i]);
	}

	bublle_qsort(starr, sizeof(starr) / sizeof(starr[0]), sizeof(starr[0]), stuby_name);




	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值