• 书面采访系列---排序算法专辑---直接插入排序---不正确的答案正确


    面试题 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[n]依次按序插入
    {
    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[n]依次按序插入
    	{
    		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结束。

    修正后输出:


  • 相关阅读:
    互动媒体学习社区-ASP.NET MVC 后台用户管理模块
    互动媒体学习社区-ASP.NET MVC 开发步骤
    互动媒体学习社区-ASP.NET MVC 数据库设计
    辗转相除法求最大公约数和最小公倍数分析
    C语言循环
    C语言中语句的跨行支持总结
    值得一学的C语言
    概率论
    Saul's Blog
    深入浅出 神经网络
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5032463.html
Copyright © 2020-2023  润新知