【发布时间】:2014-07-22 02:40:14
【问题描述】:
最近我一直在研究排序算法,并且像许多算法介绍书籍一样,我开始阅读的那本是从选择排序实现开始的。 代码如下...
实现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;
}
}
我还在网上找到了类似的实现,使用最小值来定位数组中的最小值,然后将其与数组位置 i 中的项目交换。我的问题,第二个实现有什么不正确的吗?这不是一个正确的选择排序,因为它没有交换它找到的每个小于位置 i 的项目的元素,而是等到它在交换之前找到数组中的最小项目?
我已经用超过 10000 个数组值对这两种算法进行了一些测试,第二个实现总是首先完成,速度几乎翻了一番。这些测试是在随机阵列上进行的。
【问题讨论】:
-
我认为您的实现 B 是正确的选择排序,它甚至看起来像 Wikipedia example implementation。它比实现 A 进行的交换更少,并且通常应该更快。
-
我的 Java 数据结构书使用了您的“B”实现。无论如何,对我来说,'A' 看起来像是改进冒泡排序的一次微不足道的尝试。
标签: algorithm sorting selection-sort