实现不同类型的冒泡排序

  • Post author:
  • Post category:其他




一、按照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;
}





版权声明:本文为f2016913原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。