【问题标题】:Sorting a String Array alphabetically by Selection Sort?通过选择排序按字母顺序对字符串数组进行排序?
【发布时间】:2023-03-06 12:55:01
【问题描述】:

我正在开发一个程序,该程序使用 compareTo 方法和选择排序按字母顺序对字符串数组进行排序。


我在下面的 minimumPosition 方法中遇到了问题。该方法旨在取数组尾部区域中的最小元素,以便选择排序程序可以方便地对列表进行排序。

我的问题是,当我对列表进行排序并通过测试仪打印它时,它会按字母顺序反向打印出来,前面有一个递减。例如(c ,z,x,y...,b,a) 反对 (a,b,c.. y,x,z)

/**
   SelectionSorter class sorts an array of Strings alphabetically.
   It uses the selection sort algorithm.

 */
public class SelectionSorter
{
    private String[] a;
    /**
       Constructs the selection sorter
       @param anArray the array to sort
     */
    public SelectionSorter4 (String[] anArray)
    {
        a = anArray;
    }


    /**
       Sorts the array managed by this selection sorter
     */
    public void sort ()
    {
        for (int i = 0 ; i < a.length - 1 ; i++)
        {
            int minPos = minimumPosition (i);
            swap (minPos, i);
        }
    }


    /**
       Finds the smallest element in a tail region of the array.
       The elements are String objects in this case, and the
       comparison is based on the compareTo method of String.
       @param from the first position of the tail region
       @return the position of the smallest element in tail region
     */
    private int minimumPosition (int from)
{

    String holder = a [from];
    int position = from;
    for (int i = from ; i < a.length ; i++)
    {
        if (a [i].compareTo (holder) > 0)
        {
            holder = a [i];
            position = i;
        }

    }
    return position;                
}

        /**
           Swaps two entries of the array
           @param i the first position to swap
           @param j the second position to swap
         */
        private void swap (int i, int j)
        {

            String temp = a [i];
            a [i] = a [j];
            a [j] = temp;

        }
    }

Tester 类:相关但这里没有问题。

    /**
       Tests the SelectionSorter4 class which sorts an array of Strings
       alphabetically.
     */
    import java.util.* ;

    public class SelectionSorterTester
    {
        public static void main(String[] args)
        {
            String[] a = randomStringArray(40, 6) ; 
            SelectionSorter sorter = new SelectionSorter(a) ;

            System.out.println(toString(a)) ;
            sorter.sort() ;
            System.out.println("----------Sorted:") ;
            System.out.println(toString(a)) ;
            System.out.println("--------------------------------") ;
        }
        /**
           Returns a string representation of the array of Strings
           @param array the array to make a string from
           @return a string like [a1, a2, ..., a_n]
         */
        public static String toString(String[] array)
        {
            String result = "[" ;
            for (int i = 0 ; i < array.length - 1; i++) {
                result += array[i] + ", " ;
            }
            result += array[array.length - 1] + "]" ;
            return result ;
        }
        /**
           Creates an array filled with random Strings.
           @param length the length of the array
           @param n the number of possible letters in a string
           @return an array filled with length random values
         */
        public static String[] randomStringArray(int length, int n)
        {
            final int LETTERS = 26 ;
            String[] a = new String[length] ;
            Random random = new Random(53) ;
            for (int i = 0 ; i < length ; i++) {
                String temp = "" ;
                int wordLength = 1 + random.nextInt(n) ;
                for (int j = 0 ; j < wordLength ; j++) {
                    char ch = (char)('a' + random.nextInt(LETTERS)) ;
                    temp += ch ;
                }
                a[i] = temp ;
            }
            return a ;
        }
    }

我认为问题在于 minimumPosition 方法,但对我来说它看起来是正确的。

【问题讨论】:

  • 乍一看,position 不应该设置为 from 而不是 0?
  • 我的错。谢谢splrs。尽管数组按字母顺序反向打印,但我仍然遇到问题。而且我想调试会是一件好事

标签: java arrays string sorting


【解决方案1】:

如果你想要升序,

改变

 if (a [i].compareTo (holder) > 0)

 if (a [i].compareTo (holder) < 0)

将此对象与指定对象进行比较以进行排序。返回一个 负整数、零或正整数,因为此对象较小 大于、等于或大于指定对象。

阅读更多:Comparable#compareTo(..)

【讨论】:

  • 这不是一个不稳定的排序吗?
  • @ElliottFrisch 不稳定意味着不稳定?AFAIK 选择排序不稳定
  • can 是,如果最小值被插入到第一个位置(而不是交换) - 比如说使用 LinkedList。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多