Hello World

选择排序

1. 选择排序

1.1 排序原理

  • 将数组分为两个区间,一个有序区间,一个无序区间。开始默认数组为无序区间;
  • 从无序区间取最小的一个元素,将最小的元素与无序区间的第一个元素交换位置,即插入有序区间的末尾;
  • 重复这个过程,直到无序区间没有元素;

1.2 性能分析

1.2.1 执行效率

  • 最小时间复杂度:数据完全有序时,只需进行一次遍历操作即可,时间复杂度是O(n^2);
  • 最大时间复杂度:数据倒序排序时,需要n次插入操作,时间复杂度是O(n^2);
  • 平均情况复杂度:时间复杂度是O(n^2);

1.2.2  空间复杂度

  每次交换仅需1个临时变量,故空间复杂度为O(1),是原地排序算法。

1.2.3 算法稳定性 

  假设数组为 5 8 5 2,第一选择最小元素时前面的5被换到后面了,所以不是稳定排序。

1.3 代码实现

public static int[] selectSort(int[] a){
        if (a.length <= 1)
        {
            return a;
        }
        // 默认初始数组为无序区间,从第一个元素开始排序
        for (int i = 0; i < a.length; i++)
        {
            // 开始默认无序区间第一个元素最小
            // temp为最小的元素
            int temp = a[i];
            // 最小元素的下标
            int min = i;
            // 从无序区间的第二个元素开始进行比较
            for (int j = i+1; j < a.length; j++)
            {
                // 有元素比最小元素还小,将那个元素赋给最小元素,并记录它的下标
                if (temp > a[j])
                {
                    temp = a[j];
                    min = j;
                }
            }
            // 将最小元素与无序区间的第一个元素进行交换
            a[min] = a[i];
            a[i] = temp;
            System.out.println(i+" :"+Arrays.toString(a));
        }
        
        return a;
    }

 

posted @ 2019-03-06 22:24  小小忧愁米粒大  阅读(148)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书