Выбор Сортировка в Java прекращает сортировку по истечении времени [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

3
задан Michael Yaworski 4 February 2014 в 23:47
поделиться

15 ответов

/* Implementation of selection sort */

import java.util.Arrays;
import java.util.Scanner;


public class SelectionSort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the number of elements of the array");
        int n = in.nextInt();
        int []a = new int[n];
        System.out.println("Enter the integer array of elements");
        for (int i=0; i<n ; i++)
        {
            a[i] = in.nextInt();
        }
        System.out.println("Before Sorting: "+Arrays.toString(a));
        a = sort(a);
        System.out.println("After Sorting: "+Arrays.toString(a));
    }

    private static int[] sort(int[] a) {
        // TODO Auto-generated method stub

        for(int i=0; i<a.length-1;i++)
        {
            int index=i;
            for(int j=i+1; j<a.length;j++)

                if(a[j]<a[index])
                {
                    index=j;
                }
                int small = a[index];
                a[index] = a[i];
                a[i]=small;

        }
        return a;
    }
}
0
ответ дан Adriaan 19 August 2018 в 13:32
поделиться

Сортировка выбора - это алгоритм, который формирует элементы массива в порядке ANSI или порядке DENSI. Наилучший случай, средний случай и худшая временная сложность - (n2). Сортировка выбора не лучше для сортировки массива ... Реализация сортировки выбора приведена ниже:

import java.util.Scanner;

class selection{
      public static void main(String a[]){

             Scanner sc=new Scanner(System.in);
             System.out.print("size :");
             int n=sc.nextInt();

             int i,j,tmp,minVal;

             int[] ar=new int[n];

             for(i=0;i<n;i++){
                  ar[i]=sc.nextInt();
             }

             for(i=0;i<(n-1);i++){
                  minVal=ar[i];
                  for(j=(i+1);j<n;j++){
                          if(minVal>ar[j]){
                                  minVal=ar[j];
                                  tmp=ar[i];
                                  ar[i]=minVal;
                                  ar[j]=tmp;
                          }
                  }

            }

            for(i=0;i<n;i++){
                  System.out.print(ar[i]+"  ");
            }
  }
0
ответ дан Brian Tompsett - 汤莱恩 19 August 2018 в 13:32
поделиться

Ваш вопрос, кажется, находится в вашем комментарии

min = i;//Selection sort algorithm says that find the minimum in the
        // array, but first element is not minimum.What's point here?

. То есть вы можете предположить, что первый, который вы проверяете, является самым низким, так что у вас есть место для начала. В конце концов, это может быть не минимальный, а тот, который вы проверили на этой итерации, это самый низкий показатель до сих пор!

2
ответ дан corsiKa 19 August 2018 в 13:32
поделиться
public class SelectionSort {

public static void main(String[] args) {
    int[] A = {5,4,3,2,1};
    int l = A.length;

    for (int i = 0; i < l-1; ++i ){
        int minPos = i;

        // Find the location of the minimal element
        for (int j = i + 1; j < l; ++j){
            if ( A[j] < A[minPos]){
                minPos = j;
            }
        }

        if (minPos != i){
            int temp = A[i];
            A[i] = A[minPos];   
            A[minPos] = temp;
        }
    }
    System.out.println(Arrays.toString(A));
}
}
0
ответ дан Ethan 19 August 2018 в 13:32
поделиться
  • 1
    Хотя этот фрагмент кода может решить вопрос, , включая объяснение , действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – Paul Stenne 5 June 2017 в 14:54
  • 2
    Спасибо за комментарий. Будет добавлено объяснение – Ethan 7 June 2017 в 19:37

Как уже упоминалось ранее, вы не обновляете переменную 'min' во внутреннем цикле. Целью внутреннего цикла является поиск индекса наименьшего элемента. Вы также должны переместить «swap» во внешний цикл. Ниже представлен псевдо-код выбора:

Selection Sort
Inputs:
  A: an array
  n: the number of elements in A to sort

Procedure SELECTION-SORT (A, n)
1. For i = 0 to n – 1:
  A. Set minIndex to i.
  B. For j = i + 1 to n:
    i. If A[j] < A[minIndex], then set minIndex to j. // Add this
  C. Swap A[i] with A[minIndex]. // Move this to outside of the inner loop

Взгляните на ссылку на мой блог ниже, чтобы увидеть полное объяснение алгоритма выбора выбора. Существуют реализации в Java, C ++, Python и JavaScript.

http://brianredd.com/algorithm/selection-sort

0
ответ дан Glorfindel 19 August 2018 в 13:32
поделиться
  • 1
    Обратите внимание, что если вы хотите рекламировать свой собственный продукт / блог, вы должны раскрыть свою принадлежность в ответе , иначе ваш ответ может быть помечен как спам. Пожалуйста, прочитайте Как не спамер – CalvT 5 June 2017 в 14:52
  • 2
    Сейчас я редактировал некоторое раскрытие (прежде чем я потрудился проверить, были ли вы недавно активны). Но, пожалуйста, обратите внимание на то, что говорит @CalvT. – Glorfindel 5 June 2017 в 14:53
    int[] arr = {5,4,3,2,1};

    for (int i = 0; i < arr.length - 1; i++)
         {
            int index = i;
              for (int j = i + 1; j < arr.length; j++)
                  if (arr[j] < arr[index]) 
                   index = j;

            int smallerNumber = arr[index];  
            arr[index] = arr[i];
            arr[i] = smallerNumber;
      }

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

0
ответ дан Ibtihaj Uddin 19 August 2018 в 13:32
поделиться
  • 1
    Хотя это может решить проблему, это не объясняет, почему. – cyroxis 18 January 2018 в 20:25

Выбор сортировки - это поиск минимального значения на каждом шаге цикла. вы не обнаружили значение min (по выражению if), просто замените значение в своем внутреннем цикле. так что вы на самом деле ничего не делали.

исправление на основе вашей реализации:

final int[] arr = { 5, 4, 3, 2, 1 }; // This is my array
    int min;
    for (int i = 0; i < arr.length; i++) {
        // Assume first element is min
        min = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;

            }
        }
        if (min != i) {
            final int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
        System.out.println(arr[i]);// I print the in ascending order
    }

это должно дать вам выход:

1
2
3
4
5
6
ответ дан Kent 19 August 2018 в 13:32
поделиться
  • 1
    вы обмениваетесь на каждый минимум - разве это не пузырь, а не сортировка? – corsiKa 2 December 2011 в 23:38
  • 2
    достаточно справедливо, при дальнейшей проверке он не выглядит как пузырь, так как он всегда меняет соседей. И это не совсем сортировка вставки. Это уникальный подход к выбору сортировки, и, конечно же, он достаточно различен, чтобы он, для меня, заслуживал бы какого-то названия, такого как «вариация сортировки». – corsiKa 2 December 2011 в 23:55
  • 3
    @glowcoder, на мой взгляд, это сортировка. сортировка сортировки всегда является ауссимингом, 1-й - min, затем найдите min из остальных элементов, если найденный min.idx & lt; gt; original (first) .idx, swap. что я сделал, каждый раз, когда новый мин нашел, поменяйте местами. сохраняя пространство переменной "min". но сделал большую замену. Я редактировал код, теперь он должен быть точно таким же, как и в текстовой книге. (не тестировался, должен работать), пузырь вроде не такой, хотя он тоже меняет. он меняет двух соседей. – Kent 2 December 2011 в 23:56

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

private static void selectionSortMethod(int[] arr) {

        for (int i = 0; i < arr.length - 1; i++) {  //no of iterations for array length
            for (int j = i + 1; j < arr.length; j++) {  //starting from next index to lowest element(assuming 1st index as lowest)
                if (arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }

        }
         //print 
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
0
ответ дан ManishS 19 August 2018 в 13:32
поделиться

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

import java.util.Arrays;

public class SelectionSort {

  public static void main(String[] args) {
    int[] input = new int[] {5,2,4,6,1,3};
    System.out.println( Arrays.toString(selectionSort(input)) );
  }

  public static int[] selectionSort(int[] input) {
    int length = input.length;
    int minimumValue = Integer.MAX_VALUE;

    for (int i = 0; i < length; ++i) {
        // find the minimumValue when j > i and swap it  with input[i] location
        for (int j =i; j < length; ++j) {
          if (input[j] <= minimumValue ) {
            minimumValue = input[j];
            input[j] = input[i];
            input[i] = minimumValue;
          }
        }
        minimumValue = Integer.MAX_VALUE;
    }
    return input;
  }

}

Я добавил к github .

0
ответ дан moxi 19 August 2018 в 13:32
поделиться

передать несортированный массив получить отсортированный массив

 public int[] selectionSort(int[] list) {
            int i, j, minValue, minIndex, temp = 0;
            for (i = 1; i < list.length; i++) {
                minValue = list[i];
                minIndex = i;
                j = i - 1;
                for (j = i; j < list.length; j++) {

                    if (list[j] < minValue) {
                        minValue = list[j];
                        minIndex = j;
                    }

                }
                if (list[i] > minValue) {
                    temp = list[i];
                    list[i] = list[minIndex];
                    list[minIndex] = temp;
                }

            }
            return list;
        }
0
ответ дан Ragulan28 19 August 2018 в 13:32
поделиться

Сначала вы должны найти минимум вместо того, чтобы считать, что первым элементом является минимальный

int[] array = {5, 4, 3, 2, 1};
for ( int i = 0; i < array.length; i++ ) {

  //find minimum, starting from index i
  int minIndex = i;
  int min = array[i];
  for ( int j = i + 1; j < array.length; j++ ) {
    if ( array[ j ] < min ) {
      minIndex = j;
      min = array[j];
    }
  }

  // now move the smallest element to the front, and the element at index i to the index of the minimal element
  int temp = array[ i ];
  array[ i ] = min;
  array[ minIndex ] = temp;
}
1
ответ дан Robin 19 August 2018 в 13:32
поделиться

Вы должны начать с предположения, что первый элемент является наименьшим, затем перебирайте массив и, если вы найдете меньший элемент, запомните эту позицию и предположите, что это самый маленький. Когда вы дойдете до конца массива, вы должны знать положение наименьшего значения. Переключите это значение со значением в первой позиции. Теперь самое маленькое значение - первое. Начните с следующей позиции, предположите, что это наименьшее значение, итерации по остальной части массива ... (я думаю, вы поняли идею.

Пример:

3,1,2

Предположим Сравните с позицией 2, 1 & lt; 3, так что предположим, что положение 2 имеет наименьшее значение. Сравните с позицией 3, 3 & lt; 1. Поскольку мы находимся на концевом выключателе наименьшим с первой позицией (позиция 1 и 2)

1,3,2

Теперь, поскольку позиция 1 выполнена, начните с позиции 2. Предположим, что 3 (позиция 2) является наименьшим значением. Сравните с позицией 3 (2). 2 и 3 , поэтому предположим, что позиция 3 имеет наименьшее значение. Поскольку мы находимся в конце массива, мы переключаем положение 2 и 3

1,2,3

Выполнено

0
ответ дан Roger Lindsjö 19 August 2018 в 13:32
поделиться

public class Selectionsort {

public static int arr []; public static int y;

public static void main (String args []) {

System.out.println («Введите число элементов, которое вы хотите ввести для сортировки»);

int nofele= Integer.parseInt(args[0]);

System.out.println("Enter number of element entered for sorting is "+ "\n" +nofele);

arr = new int[nofele];

System.out.println("Entered array is");

for(int i=1,j=0;i<=nofele;i++,j++){

arr[j]=Integer.parseInt(args[i]);

  System.out.println(arr[j]);

}

System.out.println("Sorted array for selection sort is ");

for(int k=0;k<nofele-1;k++)  {





  for(int l=nofele-k,b=1;l>=2;l--,b++){

    if(arr[k]>arr[k+b]){



     int temp=arr[k];

      arr[k]=arr[k+b];

      arr[k+b] = temp;


    }     

  }

   System.out.println(arr[k]);

}

   System.out.println(arr[nofele-1]);

}

}

0
ответ дан suyash saurabh 19 August 2018 в 13:32
поделиться
  • 1
    Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему оно решает проблему, улучшит долгосрочную ценность ответа. Вы также должны попытаться правильно отформатировать код. – Sebastian Hofmann 19 June 2018 в 19:33

Правильно:

public class Test {

public static void main(String args[]){
    int[] arr = {5,4,3,2,1}; // This is my array
    int min = 0;

    for(int i = 0;i<arr.length;i++)
    {
        //Assume first element is min
        min = i;
        for(int j = i + 1;j<arr.length;j++)
        {
            if(arr[j] < arr[min]) { min = j;}
        }
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
        System.out.println(arr[i]);//I print the in ascending order 
    }
}

}

О минимальной части: это просто относится к индексу любого текущего мин. Вы перемещаетесь по массиву до тех пор, пока не встретите новый мин и не установите этот индекс. Итак, 5 - минимальное число [min = 0], пока вы не увидите 4 [так теперь min = 1], но затем вы сравните 3 с тем, что хранится в 4 [когда min = 1], а затем осознайте, что вы должны установить min = 2. ... и т. д. и т. д.

2
ответ дан varatis 19 August 2018 в 13:32
поделиться
  • 1
    -1 Просто давая кому-то код, чтобы исправить свое домашнее задание, даже без объяснения не будет полезным вообще. Даже если вы правы, вы не помогаете им понять, и их вопрос не должен исправить их код в первую очередь ... это просто понять что-то об алгоритме. – corsiKa 2 December 2011 в 23:14
  • 2
    Я добавил комментарии позже ... если бы вы только ждали 2 минуты – varatis 2 December 2011 в 23:16
  • 3
    Также я не согласен с тем, что знание ответа не полезно, но это всего лишь личное мнение. Когда-либо видели практические экзамены без ответа? – varatis 2 December 2011 в 23:18
  • 4
    Я вижу ваши изменения (которые могут использовать какую-то работу, но они в порядке), но я не могу удалить свой downvote, если не зарегистрировано редактирование. :( – corsiKa 3 December 2011 в 00:50
0
ответ дан Syed Faizan 31 October 2018 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: