排序算法___冒泡排序___实现泛型

一、实现

无类型指针可以接收任意类型的指针,如果想用纯C语言实现泛型冒泡排序,无类型指针是必不可少的。冒泡排序的排序原则是——相邻两个元素的交换。因为交换始终发生在相邻两个元素之间,所以冒泡排序是稳定的排序算法。

//用户自己提供
int comp(void *a, void *b)	//a > b返回非零;否则返回0。
{
	return *(int*)a > *(int*)b;
}

思考,泛型指针没有类型,所以直接进行自增(减)或者解引用操作都是不合法的,为了能和已知数据类型的指针一样进行操作,我们需要在参数列表中加入元素大小。冒泡是向后冒泡而且是升序的。想要实现降序只需要用户自身将比较函数comp修改即可。

static void exchange(void *e1, void *e2, int size)		//一趟交换
{
	void *sentry = (void *)malloc(size);
	assert(NULL != sentry);
	memcpy(sentry, e1, size);
	memcpy(e1, e2, size);
	memcpy(e2, sentry, size);
}

//数组指针 元素个数 元素大小 比较函数
void bubbleSort(void *arr, int n, int size, int(*comp)(void *a, void *b))
{
	for (int i = 0; i < n-1; ++i)	//控制循环趟数
	{
		int flag = 0;
		for (int j = 1; j < n - i; ++j)
		{
			if (comp((char*)arr + (j - 1)*size, (char*)arr + j * size))
			{
				exchange((char*)arr + (j - 1)*size, (char*)arr + j * size, size);
				flag = 1;
			}
		}
		if (!flag)
			break;
	}
}

测试用例如下: 

int main()
{
	int arr[] = { 98,87,76,65,54,43,32,21,10};
	int n = sizeof(arr) / sizeof(arr[0]);
	bubbleSort(arr, n, 4, comp);
	for (int i = 0; i < n; ++i)
		printf("%d ", arr[i]);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/86546948