选择排序有不规则的行为

时间:2016-04-15 12:55:29

标签: java algorithm sorting

我正在学习算法,并坚持选择排序。这是来源:

      public static void sort(Comparable[]a){
        int n= a.length;
        for(int i=0;i<n;i++){
            int min=i;
            for(int j=i+1;j<n;j++){

                if(!isSmaller(a[min],a[j]))
                    min=j;
                    exch(a,i,min);

            }
        }

    }

    private static void exch(Comparable[] a, int i, int min) {
        Comparable t =a[i];
        a[i]=a[min];
        a[min]=t;

    }



private static boolean isSmaller(Comparable min, Comparable j){
    return min.compareTo(j)<0;
}

    public static void main(String[] args) {
        Random rand = new Random(312312);
        Integer[]list = new Integer[50];
       System.out.print("Input: ");
        for(int i=0; i<50;i++){
            list[i]=rand.nextInt(50);
            System.out.print(list[i]+" ");
        }
        sort(list);
        System.out.println("Sorted.");
    for(int k=0; k<50;k++){

            System.out.print(list[k]+" ");
        }

    }
    }

代码生成以下输出:

输入:19 34 6 26 13 2 5 32 40 49 20 33 22 38 4 35 32 30 12 3 24 10 3 37 28 22 13 15 1 27 6 46 16 1 31 2 28 15 8 6 38 8 40 6 7 12 2 48 10 27分类。

1 1 2 2 3 3 4 5 6 6 6 6 8 8 10 12 7 12 13 13 15 15 16 19 20 22 22 24 26 27 2 10 27 28 28 30 31 32 32 33 34 35 37 38 38 40 40 46 48 49

我在哪里失败?

2 个答案:

答案 0 :(得分:1)

您的代码中存在问题:

for(int i=0;i<n;i++){
    int min=i;
    for(int j=i+1;j<n;j++){
        if(!isSmaller(a[min],a[j]))
            min=j;
            exch(a,i,min); // HERE
    }
}

在实际未找到min时交换值。因此,您会得到意想不到的输出。

你需要把它放在内部for循环之后。像这样:

for(int i=0;i<n;i++){
    int min=i;
    for(int j=i+1;j<n;j++){
        if(!isSmaller(a[min],a[j]))
            min=j;
    }
    exch(a,i,min); // HERE
}

答案 1 :(得分:1)

您的代码中存在问题:

int n= a.length;
            for(int i=0;i<n;i++){
            int min=i;//here
                for(int j=i+1;j<n;j++){

                    if(!isSmaller(a[min],a[j]))
                        min=j;
                        exch(a,i,min);

                }

试试这个!!!

 int n= a.length;
            for(int i=0;i<n;i++){

                for(int j=i+1;j<n;j++){
                    int min=i;//put it in inner loop
                    if(!isSmaller(a[min],a[j]))
                        min=j;
                        exch(a,i,min);

                }