Я попытался закодировать сортировку вставкой в 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]);
}
}
}




Запустите цикл 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
:)
Спасибо всем за ответы. Я также обнаружил, отслеживая алгоритм, который переворачивает второй знак «больше» на знак «меньше» в 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()
}
Хотя этот код может решить вопрос, включая объяснение о том, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Отредактируйте свой ответ, чтобы добавить пояснение и указать, какие ограничения и допущения применяются.
Спасибо за совет, Ашиш! Чтобы уточнить, алгоритм начинается со сравнения j = 2 и i = j - 1.