Выбор сортировки параллельных массивов в ++

Отказ от ответственности: Я знаю, что параллельные массивы ужасны, и их следует избегать, и сортировка по выбору — не самая эффективная сортировка, но в этом случае именно так, как этого хочет босс. Я просмотрел множество разных веб-сайтов, и ни один из них, похоже, не нашел ответа. Также, вероятно, стоит отметить, что я новичок в C ++ и знаю только базовые принципы кодирования и отладки.

У меня есть два простых параллельных массива, и я пытаюсь разработать простую сортировку выбора, которая сортирует один из массивов, а затем соответственно меняет элементы во втором массиве. У меня есть работающая часть сортировки выборки, но, похоже, она не меняет местами элементы во втором массиве.

Вот как выглядит мой вывод:

1 (бред)
2 (бред)
3 (бред)
4 (бред)
5 (бред)

Там, где я (jibberish), консоль не образует никаких идентифицируемых букв, только странные формы (если это полезно, последний выводимый элемент — сердце).

Вот что это предполагаемый выглядеть как:

1 а
2 б
3 с
4 д
5 е

Теперь я понимаю, что в этом сценарии я мог бы легко выполнить сортировку выбора для второго массива, но моя цель — получить второй массив для замены элементов в соответствии с тем, что сортировка выбора делает с первым массивом.

Можно ли как-нибудь правильно выстроить эти массивы? Я пытался решить эту проблему в течение большей части дня, и я уверен, что это довольно простая вещь, чтобы понять, но мой мозг застрелен.

Ниже мой код, заранее спасибо за просмотр.

#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 е

РЕДАКТИРОВАТЬ 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;
}
}

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]);
0

Другие решения

Смотрите эту строку:

alph[minIndex] = num[startScan];

Вторая неисправная линия:

alph[startScan] = alph[index];

Так должно быть:

alph[startScan] = alph[minIndex];

К тому времени, когда код выходит из внутреннего цикла, размер имеет значение, превышающее размер массива.

Мой совет: используйте IDE и отладчик для отслеживания выполнения кода и проверки переменных. Кроме того, моя первая подсказка должна была заставить вас взглянуть на неверные индексы. C ++ не заботится о проверке границ массивов по умолчанию. Вы обычно получаете мусор, выходя за пределы или следуя неправильному указателю. Вы можете исправить первую проблему, выбрав опцию компилятора для проверки границ массивов. Это замедлит ваше приложение во время разработки, но может быть удалено, когда все будет работать правильно.

0

По вопросам рекламы [email protected]