选择排序的两个版本

时间:2014-07-22 02:40:15

标签: algorithm sorting selection-sort

最近我一直在研究排序算法,就像许多算法入门一样,我开始阅读的那本书开始时会选择排序实现。 代码如下......

实施A

//a is an array of ints.
int n = a.length;
    for(int i = 0; i < n; i ++){
        int min =0;
        for( int x = i+1; x <n;x++){
            if(a[x].compareTo(a[i])<0){
                Comparable tmp = a[i];
                a[i] = a[x];
                a[x] = tmp;                 
            }
        }
    }

在分析代码块后,我将算法改为以下内容。

实施B

//a is an array of ints
int n = a.length;
    for(int i = 0; i < n; i ++){
        int min =i;
        for( int x = i+1; x <n;x++){
            if(a[x].compareTo(a[min])<0){
                        min=x;      
            }
        }

        if(min>i){
            Comparable tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }

    }

我还在网上找到了类似的实现,使用min值来定位数组中的最小值,然后将其与数组位置i中的项目交换出来。我的问题,第二次实施有什么不对吗?这不是一个正确的选择排序,因为它不会交换它所定位的每个元素小于位置i的项目,而是等待直到它在交换之前找到数组中的最小项目?

我已经用两种算法运行了一些测试,超过10000个数组值,第二个实现总是先完成,几乎是速度的两倍。这些测试是在随机阵列上进行的。

1 个答案:

答案 0 :(得分:0)

实施B是正确的选择排序。实现A不是因为它总是将较小的值交换到前面,有时不是最小值。

根据维基百科 http://en.wikipedia.org/wiki/Selection_sort

  

算法通过查找未排序子列表中的最小(或最大,取决于排序顺序)元素,将其与最左边的未排序元素(将其按排序顺序)交换,并将子列表边界向右移动一个元素来继续