最近我一直在研究排序算法,就像许多算法入门一样,我开始阅读的那本书开始时会选择排序实现。 代码如下......
实施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个数组值,第二个实现总是先完成,几乎是速度的两倍。这些测试是在随机阵列上进行的。
答案 0 :(得分:0)
实施B是正确的选择排序。实现A不是因为它总是将较小的值交换到前面,有时不是最小值。
根据维基百科 http://en.wikipedia.org/wiki/Selection_sort
算法通过查找未排序子列表中的最小(或最大,取决于排序顺序)元素,将其与最左边的未排序元素(将其按排序顺序)交换,并将子列表边界向右移动一个元素来继续