【DS】排序算法之选择排序(Selection Sort)

一、算法思想

     选择排序是一种简单直观的排序算法。它的工作原理如下:

1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列;

2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

 

二、算法示意图

      图中阴影部分是未排序的序列,黄色部分是排序好的序列。第一行是待排序的初始序列,最后一行是排好序的序列。

      从第一行中选择出最小的元素1,将其和未排序序列的第一个元素交换,从而形成第二行。第二行从阴影部分找到最小的元素2,将2和阴影部分的第一个元素8交换,形成第三行。其实这个过程和冒泡排序非常相似,只是如何将下一个元素移动到排序序列的最末端的方式不一样。如此继续下去,就可以完成序列排序。

 

三、Java代码

 1 //@wiki
 2 public class SelectionSort extends Sort{
 3     public static void sort(int[] array) {
 4         int temp;
 5         int min;
 6         for (int index = 0; index < array.length - 1; index++) {
 7             printArray(array);
 8             min = index;
 9             for (int next = index + 1; next < array.length; next++) {
10                 if (array[next] < (array[min])) {
11                     min = next;
12                 }
13             }
14             temp = array[index];
15             array[index] = array[min];
16             array[min] = temp;
17         }
18     }
19 }

      算法简单,不解释。

 

四、算法复杂度

      选择排序的算法复杂度很好分析,因为从代码来看,其算法复杂度与初始序列无关,假设初始序列元素的个数为n,则算法复杂度为O(n^2),因为第10行会执行n*(n-1)/2。因此选择排序的最优/最差/平均时间复杂度都是O(n^2)。

     空间复杂度非常容易,由代码可以看出来,只需要一个位置temp用于交换即可,因此是O(1)

posted @ 2014-04-07 14:18  大脚印  阅读(1434)  评论(0编辑  收藏  举报