一次算法考试的反思

上周参加了一次算法的期中考试,需要涉及到排序算法,自认为小菜一碟、轻而易举的一次考试,却翻车了。

为了简单,排序算法我才用了冒泡排序,这是我临考场写的冒泡排序:

int bubble(int* buf, int size) {
	for (int i = 0; i < size; i++)
	{
		for (int j = i+1; j < size; j++)
		{
			if ((buf[i] > buf[j]) )
			{
				int tmp = buf[j];
				buf[j] = buf[j + 1];
				buf[j + 1]= tmp;
			}
		}
	}

	return 0;
}

考试的编译、运行、打分系统基于linux平台,而我是在windows的visual studio中开发、然后提交源码给系统打分。但是提交后没有得分,一直报"compile error"和"runtime error",导致我一直以为是考试系统的问题,所以还跟管理员沟通撕扯了半天,问系统有没有跟Windows的源码风格兼容。
简单检查了几遍代码,更是没有发现问题。

因为是远程在线考试,于是开始安装ubuntu系统,捣鼓了半天,时间快到了。

无奈提交后,立马得到一个成绩"F",这时老师又开始补刀说,这次考试占这门课的毕业成绩的分量很重,我更是又急又气。过了几天冷静下来,我开始反思。

审视了一下代码,发现自己写的冒泡排序好像确实有问题。

我上面的代码错误在于,导致每次排序后,i递增j也跟着递增,导致i前面的数字被遗漏了。

下面是我以前和在前几天的反思时写的几种冒泡算法:

int bubble2(int* buf, int size) {

	for (int i = size - 1; i >= 0; i--)
	{
		for (int j = i - 1; j >= 0; j--)
		{
			if (buf[j] > buf[j+1])
			{
				int tmp = buf[j];
				buf[j] = buf[j + 1];
				buf[j + 1]= tmp;

			}
		}
	}

	return cnt;
}
int bubble3(int* buf, int size) {

	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size; j++)
		{
			if (buf[j] > buf[j+1])
			{
				int tmp = buf[j];
				buf[j] = buf[j + 1];
				buf[j + 1]= tmp;
			}
		}
	}

	return 0;
}

bubble2也是错误的。这种处理,每次比较都把大的数往后移动,序号却往前走,比较的方向和排序大小的方向相反。

bubble3是正确的。但是比较次数和时间复杂度是 n 2 n^2 n2 。虽然冒泡排序是落后的算法,但时间复杂度表示的是算法在最坏情况下的时间复杂度,冒泡排序必然会觉得我侮辱了她。

下面是我百思不得骑姐后给出的终极答案:

int bubble4(int* buf, int size) {
	int num = size;

	for (int i = 0; i < num; i++)
	{
		for (int j = 0; j!= i &&j < num-1; j++)
		{
			if (buf[j] > buf[j + 1])
			{
				int tmp = buf[j];
				buf[j] = buf[j + 1];
				buf[j + 1] = tmp;
			}
		}
		num--;
	}

	return 0;
}

这种处理的时间复杂度虽然还是 ,但是比较次数降到了 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)

吃一堑长一智。我觉得自己一定要牢记这教训。

如果挂科了,那怪不得老师,是我自己无知无能。

你可能感兴趣的:(数据结构和算法,算法)