【东东学数据结构】选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
复杂度分析
选择排序的交换操作介于和次之间。选择排序的比较操作为次之间。选择排序的赋值操作介于和次之间。
比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次数O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
分类 | 排序算法 |
---|---|
数据结构 | 数组 |
最差时间复杂度 | О(n²) |
最优时间复杂度 | О(n²) |
平均时间复杂度 | О(n²) |
最差空间复杂度 | О(n) total, O(1)auxiliary |
最佳算法 | 偶尔出现 |
java实现:
1 import java.util.Arrays;
2
3 /**
4 * User: laichendong
5 * Date: 12-3-13
6 * Time: 上午11:11
7 */
8 public class SelectionSort {
9 public static void main(String[] args){
10 int[] a = { 49, 38, 65, 97, 76, 13, 27, 52 };
11 int i, j, k, t;
12 for(i = 0; i < a.length - 1; i++){
13 k=i;
14 for(j = k + 1; j < a.length; j++){
15 if(a[k] > a[j]){
16 k = j;
17 }
18 }
19 t = a[k];
20 a[k] = a[i];
21 a[i] = t;
22 System.out.println(Arrays.toString(a));
23 }
24 }
25 }
输出:
1 [13, 38, 65, 97, 76, 49, 27, 52]
2 [13, 27, 65, 97, 76, 49, 38, 52]
3 [13, 27, 38, 97, 76, 49, 65, 52]
4 [13, 27, 38, 49, 76, 97, 65, 52]
5 [13, 27, 38, 49, 52, 97, 65, 76]
6 [13, 27, 38, 49, 52, 65, 97, 76]
7 [13, 27, 38, 49, 52, 65, 76, 97]
8 [13, 27, 38, 49, 52, 65, 76, 97]
我理解的选择排序就是每次选择未排序集合中最小的数放到已排序序列的最后。
动画演示: