C中的初学者,我试图实现直接插入排序。 我的代码有一个bug,但我很难把手指放在它上面。如果某人有经验可以指出我正确的方向,那就非常感激!!
几点:
sizeTable
是数组(10)的维度。它不应该在任何阶段发生变化,但在退出排序算法时,它的价值为100。aSize
,mySize
和sizeTable
作为数组维度参数(确保我理解将参数传递给函数)。但是使用单个变量名称变量名不会改变任何东西(谢天谢地!)。提前致谢!
#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;
}
}
答案 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++)
代码完美无缺。