与以下选择排序代码混淆

时间:2016-09-10 04:52:59

标签: c selection-sort

int i, j, t;

for (i = 0; i < n - 1 ; i++) {
    for (j = i + 1; j < n; j++) {
        if (a[i] > a[j]) {
            t = a[i]; 
            a[i] = a[j]; 
            a[j] = t;
        }
    }
}  

我的问题是上面的代码是否是正确的选择排序代码?我从各种书籍中得到了这个代码。如果不正确,请解释原因。

2 个答案:

答案 0 :(得分:1)

是的,代码是正确的。基本上,按升序对数组进行排序需要花费O(n^2)

在每个步骤i [0..n-1],您将索引[i..n-1]中的最小元素放在索引i中。

swap 功能可确保您持续放置 i索引处两个比较值的较小值。

答案 1 :(得分:1)

在我看来,问题中显示的排序是冒泡排序,而不是选择排序。

在我的存档中已经开始使用的其他代码块中,我有一个用于不同排序算法的测试平台。测试台包括气泡,选择,插入和快速排序,它监控比较和交换。

冒泡排序和选择排序的代码是:

static void selection_sort(Data a[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int min = i;
        for (int j = i + 1; j < n; j++)
        {
            inc_comps();
            if (a[j] < a[min])
                min = j;
        }
        inc_comps();
        if (min != i)
            swap(&a[min], &a[i]);
    }
}

static void bubble_sort(Data a[], int n)
{
    for (int i = n - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            inc_comps();
            if (a[j] > a[j+1])
                swap(&a[j], &a[j+1]);
        }
    }
}

我现在不记得为什么冒泡排序的外部循环倒计时而不是起来,但更重要的一点是选择排序明显不同于问题中显示的代码 - 以及问题中的代码匹配泡沫排序更紧密。

您还可以在维基百科中查找Sorting Algorithm,其中列出了这些和许多其他算法,并链接到多个有关排序的信息来源。

测试台在不同大小的数据集上运行具有不同数据模式的不同算法。部分输出用于10,000行数据(类型int):

 Number             Filler    Sorter       Compares          Swaps             Time
  10000             Random     Quick         151583          88111 PASS    0.000593
  10000             Random    Bubble       49995000       24895500 PASS    0.143897
  10000             Random Insertion       24905489       24895500 PASS    0.028966
  10000             Random Selection       50004999           9986 PASS    0.040409
  10000          Ascending     Quick         151719          90480 PASS    0.000584
  10000          Ascending    Bubble       49995000       24876354 PASS    0.141219
  10000          Ascending Insertion       24886345       24876354 PASS    0.022601
  10000          Ascending Selection       50004999           9988 PASS    0.041173
  10000         Descending     Quick         119881          74247 PASS    0.000251
  10000         Descending    Bubble       49995000       49995000 PASS    0.081584
  10000         Descending Insertion       49995000       49995000 PASS    0.055118
  10000         Descending Selection       50004999           5000 PASS    0.050586
  10000 Forward Organ Pipe     Quick       25000000       25005000 PASS    0.034033
  10000 Forward Organ Pipe    Bubble       49995000       24995000 PASS    0.070633
  10000 Forward Organ Pipe Insertion       25004999       24995000 PASS    0.022398
  10000 Forward Organ Pipe Selection       50004999           9987 PASS    0.048300
  10000 Reverse Organ Pipe     Quick       25005002       16665004 PASS    0.025632
  10000 Reverse Organ Pipe    Bubble       49995000       24995000 PASS    0.064798
  10000 Reverse Organ Pipe Insertion       25000000       24995000 PASS    0.022568
  10000 Reverse Organ Pipe Selection       50004999           9886 PASS    0.053838
  10000            Uniform     Quick       49995000          19998 PASS    0.030855
  10000            Uniform    Bubble       49995000              0 PASS    0.038719
  10000            Uniform Insertion           9999              0 PASS    0.000021
  10000            Uniform Selection       50004999              0 PASS    0.041021

从数据中可以看出,选择排序在其执行的交换次数上得分很好,但在比较次数上却不是很好。这样可以验证我的观察结果,即问题中的算法是冒泡排序,而不是选择排序。