实现不同类型的冒泡排序

18 篇文章 0 订阅


一、按照qorst函数的原理实现不同类型的数组的排序

qorst函数是库函数,可以实现快速排序。

在MSDN下类型为

void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );头文件是stdilb.h。

该函数的参数主要包括四个部分:

1、 代排序数组的首地址,2.元素的个数,3、元素的大小,4、指向函数的指针。

功能:buf 指向的数据(包含num 项,每项的大小为size)进行快速排序。如果函数compare 的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。函数对buf 指向的数据按升序排序。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void show(int *arr, int size)
{
	assert(arr);
	assert(size > 0);
	int i = 0;
	for (; i < size; i++)
	{
		printf(" %d ", arr[i]);
	}
	printf("\n");
}
//整形类型
int Intcmp(const void *x, const void *y)
{
	return *(int*)x> *(int *)y ? -1 : *(int*)x< *(int *)y ? -1 : 0;
}
int In_sort(int *arr, int size)
{
	assert(arr);
	assert(size > 0);
	qsort(arr, size, sizeof(arr[0]), Intcmp);
}
//字符串类型
int Strcmp(const void *x,const void *y)
{
	return strcmp(*(char**)x, *(char**)y);
}
int str_Sort(char *msg[],int len)
{
	assert(msg);
	assert(len > 0);
	qsort(msg, len, sizeof(msg[0]), Strcmp);
}
int main()
{
	int *arr[] = { 1, 5, 7, 9, 4, 12 };
	int size = sizeof(arr) / sizeof(arr[0]);
	show(arr, size);
	In_sort(arr, size);

	char *msg[] = { "aaa", "ccc", "ddd", "bbb" };
	int len = sizeof(msg) / sizeof(msg[0]);
	str_Sort(msg, len);
	int j = 0;
	for (; j < len; j++)
	{
		printf(" %s ", msg[j]);
	}
	printf("\n");
	system("pause");
	return 0;
}

冒泡排序的原理:就是往上走的意思。通过两层for循环实现

1、外层的循环主要是控制次数,总次数是len-1;

2、外层主要是比较,将次大或者次小的排在最大或者最小的后面。

二、冒泡排序:

方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *swap(int*a, int*b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}
void  bubble_sort(int arr[], int len)
{
	assert(arr);
	assert(len > 0);//躺数
	int i = 0;
	for (; i < len - 1; i++)//冒泡的次数
	{
		int j = 0;
		for (; j < len - 1 - i; j++)//交换;
		{
			if (arr[j]>arr[j + 1])
				swap(&arr[j], &arr[j + 1]);
		}
	}

}
int main()
{
	int arr[] = { 2, 4, 8, 6, 3, 7, 9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, len);
	int i = 0;
	for (; i < len; i++)
	{
		printf(" %d ", arr[i]);
	}
	system("pause");
	return 0;
}
方法二、交换两个数之前判断两个数是否有序;如果已经排好序,不需要进行连个数的交换。可以flag标签来实现。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *swap(int*a, int*b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}
void  bubble_sort(int *arr, int len)
{
	assert(arr);
	assert(len > 0);//躺数
	int i = 0;
	for (; i < len - 1; i++)//冒泡的次数
	{
		int j = 0;
		int flag = 0;
		for (; j < len - 1 - i; j++)//交换;
		{
			if (arr[j]>arr[j + 1])
				swap(&arr[j], &arr[j + 1]);
			flag = 1;
		}
		if (flag == 0)
		{
			break;
		}
	}

}
int main()
{
	int *arr[] = { 2, 4, 8, 6, 3, 7, 9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, len);
	int i = 0;
	for (; i < len; i++)
	{
		printf(" %d ", arr[i]);
	}
	system("pause");
	return 0;
}
方法三、实现任意类型的冒泡排序;主要原理和qorst函数类似:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void show(int arr[], int len)
{
	assert(arr);
	assert(len > 0);
	int i = 0;
	for (; i < len; i++)
	{
		printf(" %d ", arr[i]);
	}
	printf("\n");
}
//整形数组
int intCmp(const void *x, const void *y)
{
	return *(int*)x> *(int *)y ? 1 : *(int*)x< *(int *)y ? -1 : 0;
}
//字符串数组
int Strcmp(const void *x, const void *y)
{
	return strcmp(*(char**)x, *(char**)y);
}
//交换两个数
void swap(void *num1,void *num2,size_t width)
{
	int i = 0;
	for (; i<(int)width; i++)
	{
		char tmp = (*(char *)num1+i);
		*((char *)num1 + i) = *((char *)num2 + i);
		*((char *)num1 + i )= *((char *)num2 + i);
	}
}
void bubble_Sort(void *arr, int len ,int size,int (*cmp)(const void *,const void *))
{
	assert(arr);
	assert(len>0);
	int i = 0;
	for (; i < len - 1; i++)
	{
		int j = 0;
		int flag = 0;
		for (j = i; j < len - i - 1; j++)
		{
			if (cmp((char *)arr + j*size, (char *)arr + (j + 1)*size) > 0)
			{
				swap((char *)arr + j*size, (char *)arr + (j + 1)*size, size);
			}
		}
		if (flag == 0)//判断是否为排序好的书数;
			break;
	}
}
int main()
{
	int arr[] = { 1, 5, 8, 6, 3, 4, 7, 12, 753 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble_Sort(arr, len,sizeof(arr[0]),intCmp);
	show(arr, len);
	char *msg[] = { "aaa", "ccc", "ddd", "bbb" };
	int len1 = sizeof(msg) / sizeof(msg[0]);
	bubble_Sort(msg, len1, sizeof(msg[0]), Strcmp);
	int j = 0;
	for (; j < len1; j++)
	{
		printf(" %s ", msg[j]);
	}
	printf("\n");
	system("pause");
	return 0;
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值