0

免责声明:我知道并行数组很糟糕,应该避免,选择排序不是最有效的排序,但在这种情况下,这是老板想要的方式。我查看了很多不同的网站,但没有一个似乎真正确定了答案。另外,指出我是 C++ 新手并且只知道相当基本的编码和调试可能是件好事。

我有两个简单的并行数组,并且正在尝试设计一个简单的选择排序来对其中一个数组进行排序,然后相应地交换第二个数组中的元素。我有选择排序部分工作,但它似乎没有正确交换我的第二个数组中的元素。

这是我的输出的样子:

1(乱码)
2(乱码)
3(乱码)
4(乱码)
5(乱码)

在我有(乱码)的地方,控制台没有形成任何可识别的字母,只是奇怪的形状(如果有帮助,输出的最后一个元素是一颗心)。

应该是这样的:

1 a
2 b
3 c
4 d
5 e

现在我意识到在这种情况下我可以轻松地对第二个数组运行选择排序,但我的意思是让第二个数组交换与选择排序对第一个数组所做的相应的元素。

有没有办法让这些数组正确排列?一天中的大部分时间我一直在尝试解决这个问题,我确信这是一件相当简单的事情,但我的大脑被击中了。

以下是我的代码,提前感谢您查看它。

#include "stdafx.h"
#include <iostream>

using namespace std;


//Function Prototypes
void sort(int num[], char alph[], int size);





//Selection sort function
void sort(int num[], char alph[], int size)
{
int startScan;
int minIndex;
int minValue;

for (startScan = 0; startScan < (size - 1); startScan++)    //Moves through the elements
{
    minIndex = startScan;
    minValue = num[startScan];

    int index = 0;

    for (index = startScan + 1; index < size; index++)  //Compares the elements
    {
        if (num[index] < minValue)
        {
            minValue = num[index];
            minIndex = index;
        }
    }

    num[minIndex] = num[startScan];
    num[startScan] = minValue;

    alph[minIndex] = alph[startScan];
    alph[startScan] = alph[index];
}
}






//Main
int _tmain(int argc, _TCHAR* argv[])
{
int num[] = {5, 3, 1, 4, 2};
char alph[] = { 'e', 'c', 'a', 'd', 'b' };
int const SIZE = 5;


//Prints out unsorted array
cout << "This is the unsorted arrays." << endl;
cout << endl;

for (int count = 0; count < SIZE; count++)
{
    cout << num[count] << " \t ";
    cout << alph[count] << endl;
}

cout << endl;
cout << endl;


//Calls the sort function
sort(num, alph, SIZE);


//Prints out the sorted array
cout << "This is the sorted array." << endl;
cout << endl;

for (int count = 0; count < SIZE; count++)
{
    cout << num[count] << " \t";
    cout << alph[count] << endl;
}


//Pause
char temp[50];
cin >> temp;


return 0;
}

编辑:我编辑了

alph[minIndex] = num[startScan]

问题,所以它现在正确读取为:

alph[minIndex] = alph[startScan]

我现在将其作为输出:

1(乱码)
2(乱码)
3(乱码)
4(乱码)
5 e

编辑 2:我在之前的编辑下编辑了代码行,现在数组正确排列,我不再收到一堆乱码输出。以下是我的代码的编辑排序功能:

//NOTICE temp VARIABLE CHANGES!
void sort(int num[], char alph[], int size)
{
int startScan;
int minIndex;
int minValue;
int temp;

for (startScan = 0; startScan < (size - 1); startScan++)    //Moves through the elements
{
    minIndex = startScan;
    minValue = num[startScan];
    temp = alph[startScan];

    int index = 0;

    for (index = startScan + 1; index < size; index++)  //Compares the elements
    {
        if (num[index] < minValue)
        {
            minValue = num[index];
            minIndex = index;
            temp = alph[index];
        }
    }

    num[minIndex] = num[startScan];
    num[startScan] = minValue;

    alph[minIndex] = alph[startScan];
    alph[startScan] = temp;
}
}
4

2 回答 2

0

看到这一行:

alph[minIndex] = num[startScan];

第二条故障线:

alph[startScan] = alph[index];

它应该是:

alph[startScan] = alph[minIndex];

到代码退出内部循环时,size 的值已超出数组大小的 1。

我的建议:使用 IDE 和调试器来跟踪代码执行并检查变量。此外,我的第一个提示应该让您查看不正确的索引。默认情况下,C++ 不关心检查数组边界。当您越界或跟随不正确的指针时,您通常会得到垃圾。您可以通过选择编译器选项来检查数组边界来解决第一个问题。这将在开发期间减慢您的应用程序,但一旦一切正常,就可以将其删除。

于 2015-04-04T01:48:04.217 回答
0

最好的解决方案可能是改变你的

num[minIndex] = num[startScan];
num[startScan] = minValue;

char  temp=alph[minIndex];
alph[minIndex] = alph[startScan];
alph[startScan] = temp;

至此,它完成了这项工作,而且真的再简单不过了。

std::swap(num[minIndex], num[startScan]);
std::swap(alph[minIndex],alph[startScan]);
于 2015-04-04T02:20:49.047 回答