6-17

编译错误:简单排序的算法就是两个循环,前一个比后一个大的时候就交换位置,比较简单,在这个上面基本没啥错误。只是系统中提交的代码只需要两个函数,排序函数和输出函数,不需要写main函数。

编译错误:注意写函数时的参数,void bubbleSort(int a[],int n)不能写成void bubbleSort(int a[1000],int n)。这里的参数只代表参数的类型。

6-18

逻辑错误:首先要明白m调整的次数是什么意思,即是需要进行循环的次数,当调用函数时输入m是多少,就调整多少次。需要注意题目的要求,对于每一次的调整,所有的战士是一起调整,而不是一个接一个调整。每位战士只会把自己手里子弹的一半给下一个人,而不是自己手里原先的子弹加上上一位给的子弹的和的一半给下一位战士。通过测试用例可以看出来。具体的做法可以新定义一个数组,存储每位战士需要给下一位战士的子弹数。

编译错误:注意当循环数组从i=0开始的时候,并不能取到a[i-1],这道题和上一题都有这样的错误,需要同学们细心。

6-19

逻辑错误:首先要搞清楚插入排序的操作。对于一个数组,从第二个数开始,到最后一个数,依次往前面的数中一个合适的位置插入,对于升序排列,就是插入的位置要比前一个数大(大于等于),后一个数小(小于等于)。这就意味着对于一个n个数的数组,一定要进行n-1次插入。循环i从1到n-1(数组从0开始到n-1),对于每一次的插入完成之后,数组从a[0]开始到a[i]一定是升序排列的。

6-20

逻辑错误:这道题目比较简单,提交的次数也比较少,成功了较高。具体的操作也比较简单。可以一次移num位,但是需要注意前面要移到后面的那部分;也可以循环num次,一位一位的移动,每次将数组的第一位(array[0])移到最后。

6-21

编译错误:重定义main函数,未实现SelectSort函数,变量未定义就使用。

部分正确:逻辑错误,变量未初始化,导致程序错误,在findMin函数中,用于记录最小值的下标未初始化,很多同学只能通过第二个测试用例的原因在此。

答案错误:未正确理解每个函数的作用,导致各个函数逻辑混乱。

格式错误:输出格式错误,数字之间要以空格分隔。

逻辑错误:对于一个长度为elementCount的数组使用选择排序,需要进行elementCount - 1次寻找最小值,而不是elementCount次。for(i=0;i<elementCount;i++)会进行elementCount次寻找最小值和输出,导致答案错误。

段错误:访问数组越界,原因同部分正确,变量未初始化,导致变量的值可能不确定。

这个题目中有大量的同学在FindMin函数中,用于记录最小值的下标未初始化,如果第一个下标对应的元素最小,那么返回的最小下标值将不可知(取决于此时这个变量对应的内存空间中的值)。

 

6-22

逻辑错误:循环条件编写错误,left = 0, right = n-1 ,循环条件应该为while(left <= right)。

逻辑错误:边界更新错误,导致遗漏对某些元素的判断。if(a[mid] == key)错写为if(a[mid] = key),导致逻辑错误。

有同学使用的是顺序查找,没有用二分查找,导致最后一个测试用例运行超时。

运行超时,循环条件未控制好,导致死循环。

书写二分查找代码(非递归),要注意循环条件,边界更新等问题。

    给出一个参考代码

    //函数功能:二分查找

    //函数参数:分别为被查找的数组,数组长度,所查找的元素

    //函数返回值:如果找到,则返回该元素在数组中的下标,否则返回-1

    int BinarySearch(int a[],int n,int key)

    {

        int left = 0;

        int right = n - 1;

        while (left <= right)

        {

            int mid = left + (right - left) / 2;

            if (a[mid] > key)

            {

                right = mid - 1;

            }

            else if (a[mid] < key)

            {

                left = mid + 1;

            }

            else

            {

                return mid;

            }

        }

        return -1;

}

6-23

逻辑错误:递归条件考虑的时候,漏掉了a[mid] == key时,直接返回mid的情况。

编译错误:函数参数传递语法错误。

段错误:递归对于区间的把握不当,造成数组访问越界。

递归终止条件不当,递归有可能无法结束,导致运行超时。

mid = (left + right ) /2 , 也可改写成mid = left + (right - left) / 2,可以避免left,right比较大的时候会造成溢出的问题。

书写递归代码要注意递归结束条件,如何把一个更大的问题转换为一个类似的更小的问题。

 

 

You have no rights to post comments