【问题标题】:Two versions of selection sort选择排序的两个版本
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 2014-12-13
    • 2012-11-18
    • 1970-01-01
    • 2018-02-24
    • 2017-06-21
    • 2013-11-23
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多