C ++插入排序混乱

时间:2019-06-15 19:46:33

标签: c++ algorithm insertion-sort

我试图用C ++自己实现插入排序。我知道有很多示例,并且将我的解决方案与现有的示例进行了比较,但是我不明白为什么我的解决方案无法正常工作。我知道有用于此的库,但我想自己实现。我有两种不同的实现,如下所示( A -一种有效, B -一种无效)。

这是 A -可以工作的。这里没有新内容。

    int myArr[5] = {5,4,3,2,1};

    for (int i = 1; i < 5; i++){

        int j = i - 1;
        int key = myArr[i];

        while(myArr[j] > key && j >= 0){
            myArr[j + 1] = myArr[j];
            j = j - 1;
        }        
        myArr[j + 1] = key;

        //Printing array to see what changed:
        for (size_t k = 0; k < 5; ++k){
            cout << myArr[k] << " ";
        }
        cout << endl;
   }

A 的示例输出:

    4 5 3 2 1 
    3 4 5 2 1 
    2 3 4 5 1 
    1 2 3 4 5

这是 B ,这是我想到的。 B A 非常相似,除了我所指出的行外,我选择使用myArr下标而不是键:

    int myArr[5] = {5,4,3,2,1};

    for (int i = 1; i < 5; i++){

        int j = i - 1;
        //int key = myArr[i]; //DIFFERENT FROM **A**


        //************** DIFFERENT FROM A **************
        //I didn't use "key", instead I chose to use myArr[i]
        while(myArr[j] > myArr[i] && j >= 0){
            myArr[j + 1] = myArr[j];
            j = j - 1;
        }

        //************** DIFFERENT FROM A **************
        //Same here: I use myArr[i] instead of key        
        myArr[j + 1] = myArr[i];

        //Printing array to see what changed:
        for (size_t k = 0; k < 5; ++k){
            cout << myArr[k] << " ";
        }
        cout << endl;
   }

B 的示例输出:

    5 5 3 2 1 
    5 5 5 2 1 
    5 5 5 5 1 
    5 5 5 5 5 

我不明白,我所做的唯一更改就是没有将当前值存储在变量中。我知道我可以轻松做到这一点,并且一切都会好起来的,但令我困扰的是我不知道为什么 B 是不正确的。任何指导将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是一个手工遍历代码的好练习。有什么变化? keymyArr[i]中值的临时存储。看似无害的重构的问题在于,myArr[j + 1] myArr[i]在内循环的第一次迭代中。注意:

int j = i - 1;
...
myArr[j + 1] = myArr[j]; // j + 1 === i

本质上是:

myArr[i] = myArr[j]; // whoops!

在这里,我们将myArr[i]重新分配给其他东西,而不是将值复制并存储在key中。每当myArr[i]元素尚未排序时,我们在每次外循环迭代中都会丢失一个元素。

保留key变量!

答案 1 :(得分:0)

我将使用i = 1来说明它为什么工作与您期望的不同。

int j = i - 1;

j变为0。

myArr[j + 1] = myArr[j];

在此为myArr [1]分配了myArr [0]的值。这就是问题所在,因为

myArr[j + 1] = myArr[i];

将myArr [0]的值(在前面提到的行中修改)分配给myArr [1]。

简而言之,移位会删除要插入的值。这就是为什么您需要将其复制到另一个变量(代码A中的键)的原因。