📜  DAA-选择排序

📅  最后修改于: 2021-01-12 03:39:59             🧑  作者: Mango


这种类型的排序称为选择排序,因为它通过对元素进行重复排序而起作用。它的工作方式如下:首先在数组中找到最小的元素,然后与位于第一个位置的元素交换,然后找到第二个最小的元素,并将其与位于第二个位置的元素交换,然后以这种方式继续操作,直到整个数组成为排序。

Algorithm: Selection-Sort (A) 
fori ← 1 to n-1 do 
   min j ← i; 
   min x ← A[i] 
   for j ←i + 1 to n do 
      if A[j] < min x then 
         min j ← j 
         min x ← A[j] 
   A[min j] ← A [i] 
   A[i] ← min x 

选择排序是最简单的排序技术之一,对于小型文件非常有用。它具有非常重要的应用程序,因为每个项目实际上最多只能移动一次。

节排序是一种用于对具有非常大的对象(记录)和小键的文件进行排序的选择方法。如果数组已经按降序排序,而我们想按升序排序,则会发生最坏的情况。

但是,选择排序算法所需的时间对要排序的数组的原始顺序不是很敏感:测试A [j] < min x在每种情况下执行的次数完全相同。

选择排序花费了大部分时间来尝试在数组的未排序部分中找到最小元素。它清楚地显示了选择排序和冒泡排序之间的相似性。

  • 冒泡排序会在每个阶段选择剩余的最大元素,但会浪费一些精力,将未排序的部分排序。

  • 选择排序在最坏的情况和平均情况下都是二次的,并且不需要额外的内存。

对于从1n-1的每个i ,都有一个交换和n-i个比较,因此总共有n-1个交换和

(n-1)+(n-2)+ … + 2 + 1 = n(n-1)/ 2个比较。

无论输入数据是什么,这些观察都成立。

在最坏的情况下,这可能是平方的,但在平均情况下,此数量是O(n log n) 。这意味着Selection排序运行时间对输入非常不敏感

实作

Void Selection-Sort(int numbers[], int array_size) { 
   int i, j; 
   int min, temp;  
   for (i = 0; I < array_size-1; i++) { 
      min = i; 
      for (j = i+1; j < array_size; j++) 
         if (numbers[j] < numbers[min]) 
            min = j; 
      temp = numbers[i]; 
      numbers[i] = numbers[min]; 
      numbers[min] = temp; 
   } 
} 

Unsorted list:

5 2 1 4 3

一次迭代:

最小= 5

2 <5,最小= 2

1 <2,最小= 1

4> 1,最小= 1

3> 1,最小= 1

Swap 5 and 1

1 2 5 4 3

第二次迭代:

最小= 2

2 <5,最小= 2

2 <4,最小= 2

2 <3,最小= 2

No Swap

1 2 5 4 3

第三次迭代:

最小= 5

4 <5,最小= 4

3 <4,最小= 3

Swap 5 and 3

1 2 3 4 5

4迭代:

最小= 4

4 <5,最小= 4

No Swap

1 2 3 4 5

最后,

the sorted list is

1 2 3 4 5