2016-01-14 6 views
1

Уважаемый сотрудник Stackoverflowers,Java: алгоритм сортировки вставки Swap

Мой метод подкачки не работает внутри метода insertionSort; он не меняет элементы массива.

Что случилось с моим алгоритмом сортировки вставки?

package AlgoExercises; 

import java.util.Arrays; 

public class InsertionSort { 

    static int[] numbersArray = { 5, 2, 4, 6, 1, 3 }; 

    static void swap(int a, int b) { 
    int temp = a; 
    a = b; 
    b = temp; 
    } 

    static void insertionSort(int[] numbersArray) { 
    for (int i = 1; i < numbersArray.length - 1; i++) { 
     int j = i; 
     while ((j > 0) && (numbersArray[j] < numbersArray[j - 1])) { 
     swap(numbersArray[j], numbersArray[j - 1]); 
     j = j - 1; 
     System.out.println(Arrays.toString(numbersArray)); 
     } 
    } 
    } 

    public static void main(String args[]) { 
    insertionSort(numbersArray); 
    } 
} 

Решение:

После фиксации метод подкачки, где ИНТ [] был включен в его параметры, подкачка теперь работает! Я также отредактировал numbersArray.length-1 для numbersArray.length.

Благодарим вас за помощь!

package AlgoExercises; 

import java.util.Arrays; 

public class InsertionSort { 

    static int[] numbersArray = { 5, 2, 4, 6, 1, 3 }; 

    static void swap(int i, int j) { 
    int temp = numbersArray[j]; 
    numbersArray[j] = numbersArray[i]; 
    numbersArray[i] = temp; 
    } 

    static void insertionSort(int[] numbersArray) { 
    for (int i = 1; i < numbersArray.length; i++) { 
     int j = i; 
     while ((j > 0) && (numbersArray[j] < numbersArray[j - 1])) { 
     swap(j, j - 1); 
     j = j - 1; 
     System.out.println(Arrays.toString(numbersArray)); 
     } 
    } 
    } 

    public static void main(String args[]) { 
    insertionSort(numbersArray); 
    } 
} 
+0

вы должны установить обмен в своем массиве. в настоящее время это не так. –

+1

У вас это написано ** внутри вашего кода ** !!! – Idos

+0

Возможный дубликат http://stackoverflow.com/questions/32431061/simple-swap-in-java –

ответ

1

Java является пропуском на языке значение, поэтому поменять местами int переменные, передаваемые методу swap не имеет никакого значения. Вы должны передать сам массив + два индекса для замены методу и изменить массив в методе свопинга.

static void swap(int[] arr, int i, int j) { 
    int temp = arr[j]; 
    arr[j] = arr[i]; 
    arr[i] = temp; 
} 

и называют его

swap(numbersArray, j, j-1); 

Обратите внимание, что я не проверял логику вашей реализации вставки сортировки. Этот ответ касается только вопроса свопа.

+0

Ну, нет, это не по стоимости, а по копиям ссылки. –

1

Просто чтобы дать вам еще один способ мышления, почему ваш существующий swap метод не работает: если вы пишете код, как это:

void swap(int a, int b) { 
    int t = a; 
    a = b; 
    b = t; 
} 

void callSwap() { 
    int x = 1; 
    int y = 2; 

    swap(x, y); 

    System.out.println(x + ", " + y); 
} 

Вы можете «инлайн» метод swap, в основном копируя его в callSwap способ. Семантически эквивалентный код будет:

void callSwap() { 
    int x = 1; 
    int y = 2; 

    // Start of inlined swap method. 
    { 
    int a = x; 
    int b = y; 

    int t = a; 
    a = b; 
    b = t; 
    } 
    // End of inlined swap method. 

    System.out.println(x + ", " + y); 
} 

Надеюсь, вы не ожидали бы x и y иметь поменялись ценности.

Обратите внимание, что такое поведение не имеет ничего общего с тем, что имена переменных a и b различны для x и y; Я просто решил, что они будут разными. Были ли параметры swap под названием x и y, при их вставке необходимо будет переименовать их в нечто другое, поскольку они полностью отделены от x и y в callSwap.