数据结构(九):简单选择排序

  • 通过 n-i 次元素之间的比较,从 n-i+1 个元素中选出值最小的元素,和第 i 个元素交换 (从数组中选出最小值元素与最左元素进行交换位置)

简单选择排序例子

  • 举例:

    • 假设数组如下
    528491
    • 第一趟排序:比较 { 5 2 8 4 9 1 },1 最小,1 和 5 互换位置
    128495
    • 第二趟排序:比较 { 2 8 4 9 5 },2 最小,已在最后一位,位置不变

    • 第三趟排序:比较 { 8 4 9 5 },4 最小,4 和 8 互换位置

    124895
    • 第四趟排序:…..
    124598
    • 第五趟排序:…..
    124589

简单选择排序代码

int[] arr = new int[]{1, 3, 6, 4, 7, 8, 5, 10, 9};
// 简单选择排序
for(int i = 0; i < arr.length - 1; i++) {
    int k = i;
    for(int j = k + 1; j < arr.length; j++){
        if(arr[j] < arr[k]){
            k = j;      //记下目前找到的最小值所在的位置
        }
    }
    // 移动最小的元素至最左边
    if(i != k){
        int temp = arr[i];
        arr[i] = arr[k];
        arr[k] = temp;
    }
}

简单选择排序时间的性能

  • 简单选择排序的比较次数与序列的初始排序无关
  • 假设待排序的序列有 N 个元素,则比较次数永远都是 N (N – 1) / 2
  • 而移动次数与序列的初始排序有关,当序列正序时,移动次数最少,为 0。当序列反序时,移动次数最多,为3N (N – 1) / 2
  • 简单排序综合的时间复杂度为 O(n²),综合来说优于冒泡排序
    原文作者:林塬
    原文地址: https://www.jianshu.com/p/0539d0dedf2e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞