冒泡排序法

冒泡排序法的基本思想:(以升序为例)含有n个元素的数组原则上要进行n-1次排序。对于每一趟的排序,从第一个数开始,依次比较前一个数与后一个数的大小。如果前一个数比后一个数大,则进行交换。这样一轮过后,最大的数将会出现在最末位的数组元素。第二轮则去掉最后一个数,对前n-1个数再按照上面的步骤找出最大数,该数将称为倒数第二的数组元素.....n-1轮过后,就完成了排序。


最坏排序次数为:n(n-1)/2

时间复杂度:O(n^2)


冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。


函数代码:

#include <stdio.h>

void bubbleSort(int data[], const int length)
{
	if ((data == NULL) || (length < 1))
		return;

	for (int i = length; i > 1; i--)
	{
		for (int j = 1; j < i; j++)
		{
			if (data[j - 1] > data[j])
			{
				int temp = data[j];
				data[j] = data[j - 1];
				data[j - 1] = temp;
			}
		}
	}
}

测试用例:

#include "BubbleSort.h"
#include <stdio.h>

void Test(char* testName, int data[], int length, int expectedData[])
{
	printf("%s begins: ", testName);
	bubbleSort(data, length);

	if (data == NULL)
	{
		if (expectedData == NULL)
			printf("passed!\n");
		else
			printf("failed!\n");
	}
	else
	{
		for (int i = 0; i < length; i++)
		{
			if (data[i] != expectedData[i])
			{
				printf("failed!\n");
				return;
			}
		}
		printf("passed!\n");
	}
}

void main()
{
	int data1[] = {0, 1, 2, 3, 4, 5};
	int expectedData1[] = {0, 1, 2, 3, 4, 5};
	Test("Test1", data1, sizeof(data1) / sizeof(int), expectedData1);

	int data2[] = {5, 4, 3, 2, 1, 0};
	int expectedData2[] = {0, 1, 2, 3, 4, 5};
	Test("Test2", data2, sizeof(data2) / sizeof(int), expectedData2);

	int data3[] = {-3, 5, -1, 0, 3};
	int expectedData3[] = {-3, -1, 0, 3, 5};
	Test("Test3", data3, sizeof(data3) / sizeof(int), expectedData3);

	int data4[] = {1};
	int expectedData4[] = {1};
	Test("Test4", data4, sizeof(data4) / sizeof(int), expectedData4);

	int data5[] = {1, 1, 1, 1, 1, 1};
	int expectedData5[] = {1, 1, 1, 1, 1, 1};
	Test("Test5", data5, sizeof(data5) / sizeof(int), expectedData5);
	
	//int data6[] = {a, 1, 2, 3, 4, 5};
	//int expectedData6[] = {1, 1, 1, 1, 1, 1};
	//Test("Test6", data6, sizeof(data6) / sizeof(int), expectedData6);

	Test("Test7", NULL, 0, NULL);
}

测试结果:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值