Java — мой алгоритм сортировки в алфавитном порядке не всегда работает так, как ожидалось

#java #arrays #algorithm #sorting #alphabetical-sort

#java #массивы #алгоритм #сортировка #сортировка по алфавиту

Вопрос:

Вот мой Java-код. (Объяснение в конце)

 import java.util.Scanner;
import java.util.Arrays;
/**
 *
 * @author Laksh
 */
public class Sort4 {
    public static void Swap(int[] array,int Swap1,int Swap2){
        int temporarySwapper;
        temporarySwapper=array[Swap1];
        array[Swap1]=array[Swap2];
        array[Swap2]=temporarySwapper;
    }
    public static void Swap(String[] array,int Swap1,int Swap2){
        String temporarySwapper;
        temporarySwapper=array[Swap1];
        array[Swap1]=array[Swap2];
        array[Swap2]=temporarySwapper;
    }
    public static String[] alphasort(String[] original, int level, int start, int end ){
        int swaps;
        int[] array=new int[original.length];
        for(int i=0;i<original.length;i  ){
            array[i]=(int)original[i].charAt(level);
        }
        do{
            swaps=0;
            for(int i=start;i<end;i  ){
                if(array[i]>array[i 1]){
                    Swap(original,i,i 1);
                    Swap(array,i,i 1);
                    swaps  ;
                }
            }
        }while(swaps != 0);
        return Arrays.copyOfRange(original, start, end 1);
    }
    public static String repeat(String s,int times){
        String returnString="";
        for(int i=0;i<times;i  ){
            returnString =s;
        }
        return returnString;
    }

        public static void main(String[] args) {
        Scanner input=new Scanner(System.in);        
        System.out.println("Enter 5 Names:");
        int max=Integer.MIN_VALUE;
        String[] name=new String[5];
        for(int i=0;i<5;i  ){
            name[i]=input.next();
            if(name[i].length()>max){
                max=name[i].length();
            }
        }
        for(int i=0;i<5;i  ){
            if(name[i].length()<max){
                name[i]=name[i] repeat(" ",max-name[i].length());
            }
        }

        String[] sorted=alphasort(name,0,0,name.length-1);
        for(String c:sorted){
            System.out.println(c);
        }

    }

}
  

Чтобы прояснить проблемы, с которыми я сталкиваюсь, мой код основан на поиске целого значения ascii для символа char, а затем сортировке массива целых чисел. Если первая буква строки, которую я пытаюсь ввести, равна первой из другой, код переходит ко второй букве и так далее. Чтобы избежать выхода индекса строки за пределы, я использовал метод «repeat» для добавления достаточного количества пробелов в конец каждой строки, чтобы все они были одинаковой длины — поскольку строки одинаковой длины предотвратили бы это. Проблема, с которой я сталкиваюсь, заключается в том, что сортировка выполняется правильно, но в некоторых местах происходит сбой.

например, если я передаю «butter» и «butterfly», они выводятся в порядке их ввода по отношению к другим значениям, которые отсортированы должным образом! Например:

 butter
cookie
butterfly
cookiemonster
ninja
  

сортирует в

 butter       
butterfly    
cookie       
cookiemonster
ninja  
  

принимая во внимание

 butterfly
cookie
butter
cookiemonster
ninja
  

сортирует в

 butterfly       
butter    
cookie       
cookiemonster
ninja
  

Помогите мне, поскольку я не могу найти свою ошибку.

Комментарии:

1. Ошибки нет. Опубликованный вами вывод показывает, что оба входных сигнала правильно отсортированы в одном и том же выводе, причем butter идет перед butterfly.

2. можете ли вы немного подробнее объяснить, что не так с выводом (отсортированным списком)?

3. О, прошу прощения. Я неправильно вставил выходные данные. Он был отредактирован, так что теперь вы можете увидеть проблему со 2-м выводом (1-й был фактически правильным)

4. Почему вы не используете TreeSet<String>() или RadixSort или Arrays.sort(original) ?

5. Я думаю, это какая-то домашняя работа или практика?

Ответ №1:

Вы сравнивали только первые буквы каждого слова, и порядок слов butterfly и butter не изменился.

Вы должны сравнить каждую букву каждого слова с функцией, приведенной ниже:

   int size = myArray.length;

  for(int i = 0; i<size-1; i  ) {
     for (int j = i 1; j<myArray.length; j  ) {
        if(myArray[i].compareTo(myArray[j])>0) {
           String temp = myArray[i];
           myArray[i] = myArray[j];
           myArray[j] = temp;
        }
     }