Неверный вывод на печать с сортировкой

Я пытаюсь отсортировать массив с помощью кода ниже:-

Ожидаемый результат должен быть массивом, который отсортирован в порядке возрастания.

Но когда я попытался запустить этот код, на выходе получилось 59 (6 раз)

Я попытался отладить, он добавил наблюдение в первом объявлении массива и добавил точку останова в первом цикле for, он выдает ошибку:

->->error-begin 
A syntax error in expression, near `A[6]={31,41,59,26,41,58}'.
#include<iostream>
using namespace std;
int main()
{
    int A[6]={31,41,59,26,41,58};;
int j;
int length = 6;
    for(j=2;j<length;j++)
    {
        int key;
        key = A[j];
        int i;
        i=j-1;
        while(i>0 && A[i]>key)
        {
            A[i+1]=A[i];
            i=i-1;
        }
    A[i+1]=key;
cout<<A[j];

    }


return 0;
}

Обновить:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int A[6] = { 31, 41, 59, 26, 41, 58 };
    int temp;
    int j;
    int length = 6;
    for (j = 2; j < length; j++) {
        int key;
        key = A[j];
        int i;
        i = j - 1;
        while (i > 0 && A[i] > key) {
            temp = A[i + 1];
            A[i + 1] = A[i];
            A[i] = temp;
            i = i - 1;
        }
        A[i + 1] = key;
    }
    cout << A[j];

    return 0;
}

Это должно быть похоже на пузырёк, о котором я знаю

std::sort(std::begin(A), std::end(A));

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

2 ответа

Решение

Заменить:

while(i>0 && A[i]>key)

от:

while (i >= 0 && A[i] > key)//notice the equality sign!

Он просто проверял до 1-го индекса, пока нулевой индекс не был затронут

И вы можете напечатать содержимое массива следующим образом:

for(int i=0;i<6;i++)
    cout << A[i]<<" ";

Для начала это кругом

 for (j = 2; j < length; j++) {
      ^^^^^

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

Было бы правильно написать заявление вроде

 for (j = 1; j < length; j++) {
      ^^^^^

Внутренний цикл

while (i > 0 && A[i] > key) {

не касается элемента A[0] из-за состояния i > 0Таким образом, подусловие A[0] > key никогда не будет проверено.

Лучше вместо замены каждой пары элементов, которые удовлетворяют условию, просто скопировать элементы и затем записать "добавленный" элемент в требуемую позицию.

Программа может выглядеть следующим образом.

#include <iostream>

int main()
{
    int a[] = { 31, 41, 59, 26, 41, 58 };
    const size_t N = sizeof(a) / sizeof(*a);

    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;

    for (size_t i = 1; i < N; i++)
    {
        int value = a[i];
        size_t j = i;

        for (; j != 0 && value < a[j - 1]; --j)
        {
            a[j] = a[j - 1];
        }

        if (j != i) a[j] = value;
    }

    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

Выход программы

31 41 59 26 41 58
26 31 41 41 58 59
Другие вопросы по тегам