排序算法(二)选择排序

时间:2021-11-06 22:07:42

1,算法描述

选择排序(Selection-sort),首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

2,实现步骤

  • 初始状态:无序区为R[1..n],有序区为空;
  • 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了。

  实现

 1     private static void selectionSort(int[] a) {
 2         long start = System.nanoTime();  
 3         int len = a.length;
 4         int minIndex = 0;
 5         for(int i = 0; i < len - 1; i++){//循环n-1次,每次从未排序序列中找个最小值交换到已排序序列尾部
 6             minIndex = i;
 7             for(int j = i; j < len -1; j++){//从未排序的序列中找到最小值
 8                 if(a[minIndex] > a[j]){
 9                     minIndex = j;
10                 }                
11             }
12             swap(a,minIndex,i);//把找到的最小值换到已排序序列的尾部
13         }
14         long end = System.nanoTime();
15         System.out.println((end - start)/1000.0 + "us");
16     }
17 
18     private static void swap(int[] a, int j, int i) {
19         int temp = a[j];
20         a[j] = a[i];
21         a[i] = temp;        
22     }

3,算法分析

时间复杂度:

最佳情况:T(n) = O(n^2)

最差情况:T(n) = O(n^2)

平均情况:T(n) = O(n^2)

空间复杂度:

占用常数的额外空间,所以空间复杂度为O(1)

稳定性:不稳定

 

参考:

http://www.cnblogs.com/eniac12/p/5329396.html