天天看点

经典排序算法(三)--- 选择排序

选择排序

选择排序(Selection Sort)是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法原理

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

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的序列进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

复杂度及稳定性

平均时间复杂度 最优时间复杂度 最坏时间复杂度 空间复杂度 稳定性
O(N^2) O(N^2) O(N^2) O(1) 不稳定

动画演示

经典排序算法(三)--- 选择排序

视频演示

经典排序算法(三)--- 选择排序

代码实现

  1. python
    def select_sort(_list):
        length = len(_list)
        for i in range(length):
            min_num = i
            for j in range(i+1, length):
                if _list[min_num] >= _list[j]:
                    min_num = j
            if i == min_num:
                pass
            else:
                _list[min_num], _list[i] = _list[i], _list[min_num]
    
        return _list
    
    test_sort = [7, 2, 0, 4, 2, 5, 1, 20, 81, 14, 11, 12]
    print(select_sort(test_sort))
    
    # [0, 1, 2, 2, 4, 5, 7, 11, 12, 14, 20, 81]
    
               
  2. java
    static int [] selectionSort(int[] listData){
       int min,temp;
       for (int i=0; i< listData.length; i++){
           min = i;
           for (int j=i+1;j<listData.length;j++){
               if(listData[min]>=listData[j]){
                   min = j;
               }
           }
           if(min==i){
               continue;
           }else {
               temp = listData[i];
               listData[i] = listData[min];
               listData[min] = temp;
           }
       }
       return listData;
    }
    // 查看输出,如果需要倒序,则将listData[min]>=listData[j]改为小于即可
    public static void main(String[] args) {
        int[] test = selectionSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5});
        for (int i: test) {
            System.out.println(i);
        }
    }
    // [1, 2, 3, 4, 5, 5, 8, 9, 10]
               

算法优化