您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 插入排序和书上的代码一样为什么排错了

插入排序和书上的代码一样为什么排错了

来源:网络整理     时间:2016/8/26 17:02:27     关键词:

关于网友提出的“ 插入排序和书上的代码一样为什么排错了”问题疑问,本网通过在网上对“ 插入排序和书上的代码一样为什么排错了”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 插入排序和书上的代码一样为什么排错了
描述:

插入算法

代码如下
#include
#include"InsertSort.h"
int main()
{
using namespace std;
int array[9] = {3,1,4,1,5,9,2,6,5};
insertsort(array, 9);
for (int i = 0; i < 9; i++)
{
cout << array[i] << "  ";
}
return 0;
}

另一段是
template
void insertsort(T array[], int N)
{
int j = 0;
for (int i = 1; i < N; i++)
{
T temp = array[i];
for (int j = i; j > 0 && temp < array[j - 1]; j--)
array[j] = array[j - 1];
array[j] = temp;
}
}

显示的结果是这样
 插入排序和书上的代码一样为什么排错了
存在一种情况,结果是正确的,输入为
9,8,7,6,5,4,3,2,1时,结果是正确的
我编了一个交换函数
template
void swap(T& a, T& b)
{
T temp;
temp = a;
a = b;
b = temp;
}

把插入函数改成这样后运行结果正确
#include"Swap.h"
template
void insertsort(T array[], int N)
{
int j = 0;
for (int i = 1; i < N; i++)
{
T temp = array[i];
for (int j = i; j > 0 && temp < array[j - 1]; j--)
swap(array[j], array[j - 1]);
}
}

 插入排序和书上的代码一样为什么排错了
可是我觉得书上那种算法仅仅赋值,不调用函数运行更快,
求大神分析为什么不对,万分感谢
解决方案1:

引用 2 楼 qzk1993 的回复:
Quote: 引用 1 楼 qq423399099 的回复:

它的swap交换了两个元素的值
而楼主直接array[j] = array[j - 1];这样造成的后果就是后一个元素的值被前一个元素直接覆盖了
for下面那句array[j] = temp;感觉也毫无作用

不是的啊,它是这样的,如果当前位置的数,也就是array[j]小于它前面的值,就用前一个的值赋给它,相当于前面比它大的数整体往后移了一位,此时j已经到了合适的位置,再用temp赋给array[j],达到插入的目的

原来是这样啊,内循环里不要定义j了,去掉int就好了,不然用到的j是刚进int时候定义的j,永远是0,所以答案不对

template
void insertsort(T array[], int N)
{
    int j = 0;
    for (int i = 1; i < N; i++)
    {
        T temp = array[i];
        for (j = i; j > 0 && temp < array[j - 1]; j--)
            array[j] = array[j-1];
        array[j] = temp;
    }
}

以上介绍了“ 插入排序和书上的代码一样为什么排错了”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3608962.html

相关图片

相关文章