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

Отказ от ответственности: я знаю, что параллельные массивы ужасны, и их следует избегать, и что сортировка выбором не самая эффективная сортировка, но в данном случае босс хочет, чтобы это было сделано именно так. Я просмотрел множество разных веб-сайтов, и ни один из них, похоже, не дает ответа. Кроме того, вероятно, следует указать, что я новичок в 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;
}

EDIT: я редактировал

alph[minIndex] = число[startScan]

issue, поэтому теперь он правильно читается как:

альфа[мининдекс] = альфа[начало сканирования]

Теперь я получаю это как вывод:

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;
}
}

person Oryn    schedule 04.04.2015    source источник
comment
Другая проблема заключается в том, что в строке ниже той, которую вы только что исправили, вы сохранили значение для minValue, которое вам нужно сделать то же самое при изменении массива автомобилей.   -  person West    schedule 04.04.2015
comment
Это сделало это. Я добавил новую переменную, temp, и она работает в основном как еще одно minValue. Я опубликую свой новый код для всех, кто пытается это понять. Спасибо за помощь.   -  person Oryn    schedule 04.04.2015


Ответы (2)


Лучшим решением может быть изменение вашего

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]);
person West    schedule 04.04.2015
comment
Это очень простое и элегантное решение. Я видел .swap раньше, и он никогда не работал (очевидно, это только для строк?). В любом случае, это приятно и немного очищает код. Спасибо! - person Oryn; 04.04.2015
comment
Нет, это будет работать почти для всего, проверьте список на cppreference:en.cppreference.com /w/cpp/алгоритм/своп - person West; 04.04.2015
comment
Я люблю этих людей, они потрясающие. Когда Google позволял вам блокировать результаты поиска, я бы запретил cplusplus.com только для получения cppreference. - person West; 04.04.2015

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

alph[minIndex] = num[startScan];

Вторая ошибочная строка:

alph[startScan] = alph[index];

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

alph[startScan] = alph[minIndex];

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

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

person Tarik    schedule 04.04.2015
comment
Спасибо что подметил это! Вы можете так долго смотреть на вещи, прежде чем все начнет выглядеть одинаково. Теперь я получаю последний элемент второго массива для правильной печати, но предыдущие четыре все еще тарабарщина. - person Oryn; 04.04.2015
comment
Спасибо за советы! Я забыл, что компиляторы C++ не проверяют наличие ошибок, выходящих за рамки! Я обязательно постараюсь узнать больше об отладке, еще раз спасибо за ваши советы и подсказки! - person Oryn; 04.04.2015
comment
Я забыл упомянуть, что вам нужна временная переменная, чтобы правильно поменять местами буквенно-цифровые символы. - person Tarik; 04.04.2015