Программа сортировки вставок [закрыта]

0

(Немного фона, чтобы вы не ненавидели меня, мои самые глубокие извинения, если этот пост лишний или слишком простой для этого форума) -

Я ученик средней школы и начинающий, и я только недавно начал изучать c++, и пока я изучал массивы, я столкнулся с алгоритмом сортировки вставки. Было довольно сложно понять сначала, но, посмотрев пару видеороликов, я попытался сделать свою собственную версию.

Сама программа очень проста: я запрашиваю у пользователя размер массива, а затем элементы. Затем я хочу отсортировать элементы в порядке возрастания, но проблема в том, что результат не совсем то, что я ожидаю.

Поэтому, когда пользователь вводит что-то вроде [4,2,1,3], вместо печати [1,2,3,4], я вижу [1,1,2,3]! Программа имеет только одну функцию, которая просто печатает массив и добавляет запятую каждому элементу, кроме последнего. Пожалуйста, не закрывайте эту тему, поскольку я искал ее долго и не мог найти что-то подобное, и еще раз мне очень жаль, если это избыточно.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void DisplayArray (int size, int array[]) { 
for (int k=0; k< size; k++) {
    if (k!=size-1) {
        cout << array[k] << ", ";
    }
    else {
        cout << array[k] << ".";
    }
}
}

int main(int argc, const char * argv[]) {
  int size;
  cin >> size;
  int array[size-1];
  for (int j=0; j< size; j++) {
    cin >> array[j];
         }


for (int i =1; i<size; i++) {
    int value = array[i];
    int m = i - 1;

    while (m >= 0){
        if (value < array[m]) {
            array [i] = array[m];
            array [m] = value;
            m = m - 1;
        }
        else {
            break;
        }
    }

}

DisplayArray(size, array);


 }
  • 2
    Это прекрасная возможность развить свои навыки отладки. Добавьте операторы печати или используйте отладчик, чтобы увидеть, как работает ваш код.
  • 2
    Пожалуйста , удалите второстепенную историю - вы правы, это является излишним и не имеет отношения к вопросу.
Показать ещё 1 комментарий
Теги:
c++11
algorithm
sorting

3 ответа

0
Лучший ответ

В дополнение к ответу тембра (int array[size];) возникает проблема со следующим блоком

for (int i =1; i<size; i++) {
    int value = array[i];
    int m = i - 1;

    while (m >= 0){
        if (value < array[m]) {
            array [i] = array[m];
            array [m] = value;
            m = m - 1;
        }
        else {
            break;
        }
    }
}

Линейный array[i] = array[m] неправильно перепутал array[i]. Он должен быть array[m + 1] = array[m].

Этот блок может быть немного улучшен с точки зрения удобочитаемости;

for (int i = 1; i < size; i++) {
    int j = i;

    while (j > 0) {
        if (array[j] < array[j - 1]) {
            // swap two elements, could be done with std::swap()
            int tmp = array[j];
            array [j] = array[j - 1]; 
            array [j - 1] = tmp;
            j = j - 1;
        } else {
            // beginning of an array is sorted, stop iterate
            break;
        }   
    }   
}
1
int array[size-1];
for (int j=0; j< size; j++) {
    cin >> array[j];
}

Здесь вы объявили массив с size-1, поэтому юридический индекс [0, размер-2], а не [0, размер-1].

Поскольку вы ожидаете массив с элементами size, просто объявите как int array[size]; ,

0

можешь попробовать. простой change.use array[size] не использовать array[size-1] потому что массив индексирования является array[0,1,2,3,----size-1] для array[size] и

для array [m+1] = array[m] сортировки вставки array [m+1] = array[m] заменить array[i]=array[m] потому что, когда вы используете array[i], в цикле i фиксируется, но m изменяется. поэтому он отклоняет метод сортировки вставки.

надеюсь, что это ок.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void DisplayArray (int size, int array[])
{
    for (int k=0; k< size; k++)
    {
        if (k!=size-1)
        {
            cout << array[k] << ", ";
        }
        else
        {
            cout << array[k] << ".";
        }
    }
}

int main()
{
    int size;
    cin >> size;
    int array[size];
    for (int j=0; j< size; j++)
    {
        cin >> array[j];
    }


    for (int i =1; i<size; i++)
    {
        int value = array[i];
        int m = i - 1;

        while (m >= 0)
        {
            if (value < array[m])
            {
                array [m+1] = array[m];
                array [m] = value;
                m = m - 1;
            }
            else
            {
                break;
            }
        }

    }

    DisplayArray(size, array);


}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню