这样写为什么就错了?

来源:2-7 更多关于O(n^2)排序算法的思考

___Cc

2018-09-03

template<typename T>
void InsertionSortNew(T arr[], int n)
{
    // 默认第一个元素为有序,故从1开始遍历
    for(int i=1; i<n; i++)
    {
        T temp = arr[i];
        // 如果当前的第一个比它之前的元素小,则要移动
        if(temp < arr[i-1])
        {
            int j;
            // 寻找插入的位置
            for(j = i; j > 0; j--)
            {
                if(temp < arr[j])
                {
                    arr[j] = arr[j-1];
                }
            }
            arr[j] = temp;
        }
    }

    return ;
}


把if写在for循环的条件里就对了:

template<typename T>
void InsertionSortNew(T arr[], int n)
{
    // 默认第一个元素为有序,故从1开始遍历
    for(int i=1; i<n; i++)
    {
        T temp = arr[i];
        // 如果当前的第一个比它之前的元素小,则要移动
        if(temp < arr[i-1])
        {
            int j;
            // 寻找插入的位置
            for(j = i; j > 0 && arr[j-1] > temp; j--)
            {
                arr[j] = arr[j-1];
            }
            arr[j] = temp;
        }
    }

    return ;
}


写回答

1回答

liuyubobobo

2018-09-03

试一下第15行是 if(temp < arr[j - 1]) ?每次是和前一个元素作比较。


在第二个程序13行,&&后面的条件是arr[j-1] > temp。是j - 1不是j。

0
3
liuyubobobo
回复
___Cc
你的第二个程序是正确的。我的意思是你的第一个程序的15行和第二个程序的13行不等价。第二个程序是j-1;第一个程序是j。应该做到理解后能独立写下来。不要背。加油:)
2018-09-04
共3条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程