Bugged C直接插入排序的实现

时间:2015-07-15 05:49:44

标签: c arrays sorting

C中的初学者,我试图实现直接插入排序。 我的代码有一个bug,但我很难把手指放在它上面。如果某人有经验可以指出我正确的方向,那就非常感激!!

几点:

  • 变量sizeTable是数组(10)的维度。它不应该在任何阶段发生变化,但在退出排序算法时,它的价值为100。
  • 代码运行正常,值从10下降到1(依次为100到10)。
  • 我故意使用不同的变量名称(即aSizemySizesizeTable作为数组维度参数(确保我理解将参数传递给函数)。但是使用单个变量名称变量名不会改变任何东西(谢天谢地!)。
  • 当我在CodeChef中运行时,我得到一个运行时错误,而在CodeBlocks中,我获得了一个100个元素的数组,10个第一个是正确排序的初始数组,以及来自内存的平衡随机值。为什么这样 ? (那是一个附属问题......)

提前致谢!

#include <stdio.h>
#include <stdlib.h>


void printTable(int myTable[], int aSize);
void straightInsertion(int myTable[], int mySize);

int main()
{

    int sizeTable = 10;
    int myTable[10] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};

    printTable(myTable, sizeTable);
    straightInsertion(myTable, sizeTable);
    printf("\n");
    printTable(myTable, sizeTable);


    return 0;
}

//Loop to display the array
void printTable(int myTable[], int aSize)
{
    int  i = 0;

    for (i = 0; i < aSize; i++)
    {
        printf("%d ", myTable[i]);
    }
}

//Sorting algo
void straightInsertion(int myTable[], int mySize)
{
    int i = 0, j = 0, temp = 0;
    for(j = 1; j<= mySize; j++)
    {
        temp = myTable[j];
        i = j-1;
        while(i>=0 && myTable[i] > temp)
        {
            myTable[i+1] = myTable[i];
            i--;
        }
        myTable[i+1] = temp;
    }
}

3 个答案:

答案 0 :(得分:2)

简单边界错误。你有:

#include <string>
#include <algorithm>
#include <cassert>

bool compareIgnoreSingleSwitch(const std::string& word1, const std::string& word2) {
  if (word1.size() != word2.size())
    return false;

  auto mismatch1 = std::mismatch(word1.begin(), word1.end(), word2.begin());
  if (mismatch1.first == word1.end())
    return true;  // no mismatches

  auto mismatch2 
    = std::mismatch(std::next(mismatch1.first), word1.end(), std::next(mismatch1.second));

  if (mismatch2.first == word1.end())
    return false;  // only one mismatch, can't be a switch

  // check the two mismatches are inverse of each other
  if (*mismatch1.first != *mismatch2.second || *mismatch1.second != *mismatch2.first)
    return false;

  // ensure no more mismatches  
  return std::equal(std::next(mismatch2.first), word1.end(), std::next(mismatch2.second));
}

int main() {
  assert(compareIgnoreSingleSwitch("computer", "computer"));  // equal
  assert(compareIgnoreSingleSwitch("computer", "pomcuter"));  // one switch
  assert(!compareIgnoreSingleSwitch("computer", "aomxuter"));  // not a switch 
  assert(!compareIgnoreSingleSwitch("computer", "pomputer"));  // one mismatch
  assert(!compareIgnoreSingleSwitch("computer", "ocmupter"));  // two switches
  assert(!compareIgnoreSingleSwitch("computer", "compute"));  // different length    
}

您应该使用:

for(j = 1; j<= mySize; j++)

以避免覆盖数组的末尾。

使用打印功能的良好工作。我可以建议您在函数中添加for (j = 1; j < mySize; j++) ,以避免在调用代码中使用putchar('\n');

答案 1 :(得分:2)

重构和更正straightInsertion功能

void straightInsertion(int myTable[], int mySize) {
    int i, j;
    for (i = 1; i < mySize; ++i) {
        int tmp = myTable[i];
        for (j = i; j > 0 && myTable[j - 1] > tmp; j--)
            myTable[j] = myTable[j - 1];
        myTable[j] = tmp;
    }
}

答案 2 :(得分:1)

在你的循环中,你使用了:

for(j = 1; j<= mySize; j++)

请记住,C中的数组是零索引的,这意味着数组的第一个索引是0而不是1,所以它的最后一个索引将是mySize - 1。这意味着访问myTable[mySize]总是超出范围,访问该地址是未定义的行为。

如果您将行更改为

for(j = 1; j < mySize; j++)

代码完美无缺。