Ошибка сортировки вставкой Java

Я попытался закодировать сортировку вставкой в ​​java с помощью псевдокода из книги. Вывод для этого кода должен быть числами в порядке возрастания, но по какой-то причине я получаю 10,4,5,6,7,8,9. Любая помощь приветствуется! Спасибо!

public class InsertionSort {

    public int Array[] = {10,9,8,7,6,5,4};

    public static void main(String[] args) {
        InsertionSort obj1 = new InsertionSort();
    }

    public InsertionSort() {
        InsertionSortMethod();
        PrintArray();
    }

    public void InsertionSortMethod() {
        for(int j = 2; j < Array.length; j++) {
            int key = Array[j];
            int i = j - 1;
            while(i > 0 && Array[i] > key) {
                Array[i + 1] = Array[i];
                i = i - 1;
            }
            Array[i + 1] = key;
        }   
    }

    public void PrintArray() {
        for(int i = 0; i < Array.length; i++) {
            System.out.println(Array[i]);
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
91
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Запустите цикл for с j = 1 следующим образом:

for(int j = 1; j < array.length; j++) {

и измените условие цикла while следующим образом:

while(i >= 0 && array[i] > key) {

Правильный рабочий код:

public class InsertionSort {

public int array[] = {10,9,8,7,6,5,4};

public static void main(String[] args) {
    InsertionSort obj = new InsertionSort();
    obj.insertionSortMethod();
    obj.printArray();
}


public void insertionSortMethod() {
    for(int j = 1; j < array.length; j++) {
        int key = array[j];
        int i = j - 1;
        while(i >= 0 && array[i] > key) {
            array[i + 1] = array[i];
            i = i - 1;
    }
        array[i + 1] = key;

    }   
}

public void printArray() {
    for(int i = 0; i < array.length; i++) {
        System.out.print(array[i] + " ");
    }
}

}

В третьей строке вашего кода, т.е.

InsertionSort obj1 = new InsertionSort();

Вы создаете объект класса InsertionSort, но в вашем коде он определяется как функция, я думаю, что это конструктор, вы должны упомянуть класс для большего удобства читателя.

Кроме того, вы начинаете свой цикл с 2 for(int j = 2; j < Array.length; j++) почему так? ваш единственный элемент был пропущен, поэтому начните j с 1 :)

Спасибо за совет, Ашиш! Чтобы уточнить, алгоритм начинается со сравнения j = 2 и i = j - 1.

Ben Watts 01.07.2018 15:28

Спасибо всем за ответы. Я также обнаружил, отслеживая алгоритм, который переворачивает второй знак «больше» на знак «меньше» в 5-й строке алгоритма, что позволяет работать в порядке убывания. Возможно, это опечатка в книге, которую я читаю. Еще раз спасибо!

попробуйте этот метод

 public int[] insertionSort(int[] list) {
            int i, j, key, temp;
            for (i = 1; i < list.length; i++) {
                key = list[i];
                j = i - 1;
                while (j >= 0 && key < list[j]) {
                    temp = list[j];
                    list[j] = list[j + 1];
                    list[j + 1] = temp;
                    j--;
                }

            }
            return list;
        }
package com.borntoinnovation.datastructure;

import java.util.Arrays;

public class SortingInsertion {

    public static void main(String[] args) {
        int[] array = new int[] { 4, 3, 2, 20, 12, 1, 5, 6 };

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < i; j++) {
                if (array[i] < array[j]) {
                    int temp = array[i];
                    for (int k = i; k > j; k--) {
                        array[k] = array[k - 1];
                    }
                    array[j] = temp;
                }
            }
            System.out.println(Arrays.toString(array));
        }

    }// end of main()
}

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

Makyen 14.03.2020 20:50

Другие вопросы по теме