12-选择排序:简单选择排序
本篇随笔介绍了选择排序的思想,简单选择排序的思想,简单选择排序的Java代码实现以及测试结果;并从空间复杂度、时间复杂度和稳定性三个方面分析了简单选择排序算法的性能。
1. 选择排序思想
(1.1)选择排序的基本思想是:每一趟(例如第i趟)在后面n-i+1(i=1,2, ... , n)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。选择排序中的堆排序算法是重点内容。
2. 简单选择排序的思想
(2.1)从上面选择排序的思想中可以很直观第得出简单选择排序算法的思想:假设排序表为L[1 ... n], 第i趟排序即从L[i ... n]中选择关键字最小的元素与L[i] 交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个待排序表有序。
3. 简单选择排序代码实现
1 package cn.sun.it.review; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class SelectSort { 7 8 public static void main(String[] args) { 9 System.out.println("请输入若干个整数,以逗号分隔:");10 Scanner sc = new Scanner(System.in);11 String strNums = sc.nextLine();12 String[] tempArrNums = strNums.split(",");13 int[] arr = new int[tempArrNums.length];14 for (int i = 0; i < arr.length; i++) {15 arr[i] = Integer.valueOf(tempArrNums[i]);16 }17 System.out.println("排序前:" + Arrays.toString(arr));18 selectSort_v1(arr);19 System.out.println("排序后:" + Arrays.toString(arr));20 }21 22 private static void selectSort_v1(int[] arr) {23 int min;24 int temp;25 for(int i=0;i<arr.length-1;i++){ // 一共进行n-1趟排序26 min = i; // 记录最小元素的位置27 for(int j=i+1;j<arr.length;j++){ // 在arr[i...n-1]中选择最小的元素28 if(arr[j]<arr[min]){ 29 min = j; // 更新最小元素的位置30 }31 }32 if(min != i){ // 与第i个位置进行交换33 temp = arr[i];34 arr[i] = arr[min];35 arr[min] = temp;36 }37 }38 }39 40 }
4. 测试结果
5. 性能分析
(5.1)空间效率:仅使用常数个辅助单元,故而空间效率为O(1);
(5.2)时间效率:从上述代码中可以看出,在简单选择排序过程中,元素移动的操作次数很少,不会超过3(n-1)次,最好的情况是移动0次,此时对应的表已经有序;但元素间比较的次数与序列的初始状态无关,始终是n(n-1)/2次,所以时间复杂度始终是O(n2)
(5.3)稳定性:在第i趟找到最小的元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变。例如,表L={2,2,1},经过一趟排序后,
L={1,2,2},最终排序序列也是L={1,2,2},显然,2与2 的相对次序已经发生了变化,因此,简单选择排序是一个不稳定第排序方法。