选择在++中排序并行数组

时间:2015-04-04 01:29:15

标签: c++ arrays sorting selection-sort parallel-arrays

免责声明:我知道并行数组非常糟糕,应该避免使用并且选择排序不是最有效的排序,但在这种情况下,这就是老板人想要完成的方式。我看过很多不同的网站,但没有一个真正能够找到答案。此外,可能很好地指出我是C ++的新手并且只知道相当基本的编码和调试。

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

以下是我的输出结果:

  

1(jibberish)
  2(jibberish)
  3(jibberish)
  4(jibberish)
  5(jibberish)

我有(乱码)控制台不会形成任何可识别的字母,只是奇怪的形状(如果它有用,输出的最后一个元素是一颗心)。

以下是假设的样子:

  

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(jibberish)
  2(jibberish)
  3(jibberish)
  4(jibberish)
  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;
}
}

2 个答案:

答案 0 :(得分:0)

见这一行:

alph[minIndex] = num[startScan];

第二条错误的路线:

alph[startScan] = alph[index];

应该是:

alph[startScan] = alph[minIndex];

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

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

答案 1 :(得分: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]);