zoukankan      html  css  js  c++  java
  • 数组排序(2)-选择排序

    (一)选择排序

        表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

        选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

      1.算法描述:

       (1) 初始状态:有序区为空,无序区为R[1..n];

       (2) 第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个的新无序区;

       (3) n-1趟结束,数组有序化了。

      2.手动模拟排序:

       

      3.算法分析:

        (1)时间复杂度:平均情况 O(n2)  最好情况 O(n^2)  最坏情况 O(n^2)

        (2)空间复杂度: O(1)

        (3)稳定性:不稳定

    (二)代码体现:

    public class SelectionSort {
        public static void main(String[] args) {
            int[] arr = {3,4,1,2,7,8,6,5};
            Selection(arr);//排序
            System.out.println("-----------------------------------------");
            print(arr);//打印结果
        }
    
        private static void Selection(int[] arr) {
            if(arr == null || arr.length <= 1){
                return;
            }
            for (int i = 0; i < arr.length - 1; i++) {
                int minIndex = i;
                for (int j = i; j < arr.length; j++) {
                    if(arr[j] < arr[minIndex]){
                        minIndex = j;
                    }
                }
                //交换
                if(minIndex != i){
                    int temp = arr[minIndex];
                    arr[minIndex] = arr[i];
                    arr[i] = temp;
                }
                //打印每一趟排序结果
                print(arr);
            }
        }
    
        public static void print(int[] arr){
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i]);
                if(i != arr.length - 1){
                    sb.append(", ");
                }
            }
            System.out.println(sb.append("]"));
        }
    }
    SelectionSort
  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/bug-baba/p/10547046.html
Copyright © 2011-2022 走看看