请协助判定我的排序代码是Insertion Sort还是Bubble Sort?
我的插入排序代码被误判成冒泡排序,求帮忙鉴定!
我在编程考试里被要求写一个插入排序(Insertion Sort)算法,用来给老师提供的数字数组排序。我觉得自己写得没问题——虽然代码不是最简洁的那种,但确确实实实现了要求的排序功能。结果老师直接判定我写的是冒泡排序(Bubble Sort),还拒绝重新检查。我坚信这就是插入排序,所以特意来请大家帮忙判断一下!
考试要求需要先展示无序数组、再输出每一步的排序过程、最后展示排序完成后的有序数组,我的代码如下:
#include "stdafx.h" #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { double killme[34] = {7,5,6,5,78,9,63,36,32,5,78,63,2,1,9,45,23,32,21,45,78,32,58,23,36,41,23,45,21,45,6,9,36,7}; cout << "Arreglo desordenado: \n"; for (int i = 0; i < 34; i++) { if(i != 33) { cout << killme[i] << ", "; } else { cout << killme[i] << "."; } } cout << endl; cout << endl; cout << "Pasos: " << endl; double var; int j = 1; int k = 0; for (int i = 0; i < 33; i++) { if (killme[i+1] < killme[i]) { while (killme[i+1] < killme[i]) { var = killme[i]; killme[i] = killme[i+1]; killme[i+1] = var; i--; if (i<0) { break; } } for (int i = 0; i < 34; i++) { if (i != 33) { cout << killme[i] << ","; } else { cout << killme[i] << "."; } } cout << endl; cout << endl; } i = k; k++; } cout << "Arreglo ordenado: \n"; for (int i = 0; i < 34; i++) { if (i != 33) { cout << i+1 << "." << killme[i] << ", " << endl; } else { cout << i+1 << "." << killme[i] << "." << endl; } } // 原代码末尾的"co..."应为输入截断,不影响核心逻辑判断 }
核心逻辑分析:先搞懂插入排序和冒泡排序的本质区别
- 插入排序:核心是把单个未排序元素逐个插入到已排序序列的正确位置。常见实现要么是先暂存元素,再把前面比它大的元素往后移,最后插入;要么就像你这样,通过相邻交换的方式,把当前元素一步步往前挪,直到它找到合适的位置。
- 冒泡排序:核心是多次遍历整个未排序区间,每次把区间里最大的元素“冒泡”到末尾,每一轮都会确定一个最大元素的最终位置,不会针对单个元素向前回溯整个已排序区间。
你的代码完全是插入排序的逻辑
看你的代码流程:
- 从数组的第二个元素开始(通过
i+1定位),当它比前一个元素小时,进入循环 - 不断和前一个元素交换,同时
i--向前回溯,直到它不再小于前一个元素(或者到数组开头) - 每完成一次元素的“插入”操作,就打印当前数组状态
这完全是插入排序的核心思路——聚焦于把当前未排序的元素,插入到前面已排序区间的正确位置。你只是用了相邻交换的实现方式,但这丝毫不改变它是插入排序的本质。
而冒泡排序不会这样针对单个元素往前回溯,它是每一轮从左到右扫,把大元素往后换,每一轮只处理到未排序的末尾。你的代码逻辑和冒泡排序完全不沾边。
所以老师的判断确实有误,你可以拿着这个分析去和老师沟通,把两种排序的核心区别讲清楚,再结合你的代码逻辑说明,应该能让老师重新判断的。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

