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

面试题 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结束。

修正后输出:

时间: 2024-10-29 09:50:40

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

排序算法之 Java插入排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Insert { public int[] sort(int[] arr){ if ( arr == null || arr.length <= 1 ){ return

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

常用排序算法(三)直接插入排序

直接插入排序 概要 本章介绍排序算法中的直接插入排序.内容包括:1. 直接插入排序介绍2. 直接插入排序图文说明3. 直接插入排序的时间复杂度和稳定性4. 直接插入排序实现4.1  直接插入排序C实现4.2  直接插入排序C++实现4.3  直接插入排序Java实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3596881.html 更多内容:数据结构与算法系列 目录 直接插入排序介绍 直接插入排序(Straight Insertion Sort

结构-行为-样式-Js排序算法之 直接插入排序

最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n>=2)个值已经排序好了,那我们就从第n+1个与前面进行比较,当  a[n+1] > a [i] && a[n+1] < a[i-1] 的时候则进行插入,以此类推. var arr = [23,85,61,37,55,12,63,12,99,39,70,21]; function

排序算法总结之插入排序

一,插入排序介绍 插入排序是基于比较的排序.所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置. 因此,对于这类排序,就有两种基本的操作:①比较操作: ②交换操作 其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置.(下面的插入排序就用到了这个技巧)--因为,交换操作需要三次赋值,而移动操作只需要一次赋值! 有些排序算法,比较次数比较多,

排序算法之直接插入排序

基本思想: 直接插入排序的思想非常简单,将序列中第一个元素作为一个有序序列,然后将剩下n-1个元素按关键字大小依次插入该有序序列,每插入一个元素后依然保持该序列有序,经过n-1趟排序后即成为有序序列. 直接插入排序示例: 由图可以看到,括号里面的都是有续表,而货号后面的灰色关键字是下一个将要插入的元素. 代码: void InsertSort(int A[],int n) { int i; for(i=1; i<n; i++)//总共n-1趟 { int j=i; int temp=A[i];/

排序算法之直接插入排序算法

基本思想 当插入第i(i≥1)个元素,前面的i-1个元素已经排好序.这时用第i个元素与前i-1个元素进行比较,找到插入位置即将第i个元素插入,原来位置上的元素向后顺移. 代码: //待排数据存储在数组a中,以及待排序列的左右边界 public void InsertSort(int[] a, int left, int right) { int temp;//临时变量 int i, j;//循环标记 for (i = left + 1; i <= right; i++) {//遍历待排序列 if

常用排序算法之--直接插入排序

一直以来都是从博客园吸收营养,很想有机会写一些对博友们有用的文章,来回馈大家的无私奉献.最近博主在找工作,听小伙伴们说,数据结构与算法是必考项.于是痛下绝心决定写写排序算法.以备自查,同时与小伙伴们互勉.欢迎大家转载,如有错误,请指正.必感激不尽! 学习交流qq:792911374,闲话不说,开始正文了..... 直接插入排序将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止

我的Java开发学习之旅------&gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可