书面采访系列---排序算法专辑---直接插入排序---不正确的答案正确
2015-12-09 12:46
429 查看
面试题 24:编码直接插入排序
原来的答案:
#include<iostream.h> void main( void ) { int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 }; int i,j; for( i = 0; i < 10; i++) { cout<<ARRAY[i]<<" "; } cout<<endl; for( i = 2; i <= 10; i++ ) //将 ARRAY[2],…,ARRAY 依次按序插入 { if(ARRAY[i] < ARRAY[i -1]) //假设 ARRAY[i]大于一切有序的数值,ARRAY[i]将保持原位不动 { ARRAY[0] = ARRAY[i]; //将 ARRAY[0]看做是哨兵,是 ARRAY[i]的副本 j = i - 1; do{ //从右向左在有序区 ARRAY[1..i-1]中查找 ARRAY[i]的插入位置 ARRAY[j+1] = ARRAY[j]; //将数值大于 ARRAY[i]记录后移 j-- ; }while( ARRAY[0] < ARRAY[j] ); ARRAY[j+1]=ARRAY[0]; //ARRAY[i]插入到正确的位置上 } } for(i = 0; i < 10; i++) { cout<<ARRAY[i]<<" "; } cout<<endl; }
思路分析:
整个思路没有不论什么错误。错误分析例如以下:
for( i = 2; i <= 10; i++ ) //错误一:相当于默认i=0和i=1是已经排好序的;错误二:i=10明显超出了数组分配的大小。栈溢出错误
ARRAY[0]//选为哨兵导致序列中的第一数字总是更改无法实现正确排序
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
修正答案:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int ARRAY[10] = { 6, 9, 3, 7, 2, 5, 4, 0, 1, 8 }; int i,j,temp; //输出排序前的数列 for(i = 0; i < 10; i++) { cout<<ARRAY[i]<<" "; } cout<<endl; for( i = 1; i < 10; i++ ) //将 ARRAY[2],…,ARRAY 依次按序插入 { if(ARRAY[i] < ARRAY[i -1]) //假设 ARRAY[i]大于一切有序的数值,//ARRAY[i]将保持原位不动 { temp = ARRAY[i]; //将temp做哨兵,是 ARRAY[i]的副本 j = i - 1; do{ //从右向左在有序区 ARRAY[1..i-1]中;查找 ARRAY[i]的插入位置 ARRAY[j+1] = ARRAY[j]; //将数值大于 ARRAY[i]记录后移 j-- ; }while( temp < ARRAY[j] ); ARRAY[j+1]=temp; //ARRAY[i]插入到正确的位置上 } } //输出排序后的数列 for(i = 0; i < 10; i++) { cout<<ARRAY[i]<<" "; } cout<<endl; return 0; }
修正分析:
修正一:讲temp作为哨兵。修正二:for循环从i=1開始9结束。修正后输出:
相关文章推荐
- 郑州大学第九届程序设计竞赛热身赛题解
- File常用方法
- node-webkit中node-serialport或sqlite3报错的解决办法
- iOS CoreData 存取数组字典等数据类型
- 为什么css中添加了display:none其它js代码会失效?
- UITableViewCell 和NSIndexPath互取
- 关于 android app 返回键模拟 home键 功能的介绍_仿QQ返回键 又重新回到当前界面_锁屏状态 又要重新唤醒
- 从上往下打印二叉树
- 微信支付 APP 支付方式的服务器端处理程序
- 类的继承与接口
- Java——1个自动拆箱的例子
- Java中为何与0xff进行与运算
- 《小亚和小信》小强,你就长点心吧!
- 2015年-Google北京区-software engineering intern-面试经验
- 栈的压入、弹出序列
- POJ1068——Parencodings
- Android学习笔记(6):Android应用的基本组件
- GROUP BY,WHERE,HAVING之间的区别和用法
- Linux下Git和GitHub使用方法总结
- VC 运行时库 /MD、/MDd 和 /MT、/MTd