一次算法考试的反思
最佳答案 问答题库608位专家为你答疑解惑
上周参加了一次算法的期中考试,需要涉及到排序算法,自认为小菜一碟、轻而易举的一次考试,却翻车了。
为了简单,排序算法我才用了冒泡排序,这是我临考场写的冒泡排序:
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(n−1) 。
吃一堑长一智。我觉得自己一定要牢记这教训。
如果挂科了,那怪不得老师,是我自己无知无能。
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"一次算法考试的反思":http://eshow365.cn/6-32704-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!