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;
}
}
}
我的问题是上面的代码是否是正确的选择排序代码?我从各种书籍中得到了这个代码。如果不正确,请解释原因。
答案 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
从数据中可以看出,选择排序在其执行的交换次数上得分很好,但在比较次数上却不是很好。这样可以验证我的观察结果,即问题中的算法是冒泡排序,而不是选择排序。