排序——选择排序

排序方式:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
若将数据利用选择排序进行由小到大排序,有两种方式:第一种方式是每次扫描将最小值找出来放在第一位。同理也可以每次扫描将最大值找出来放在最后一个位置。

第一种方式的方法为由第一个位置的数据开始,先将第一个位置的数据看做整组数据最小的元素,依次与后面的元素进行比较,若在后面的数据中找到比第一个位置的数据小的,则更新最小值为该数据,一次扫描过后,找到待排序区间的最小值,将其与第一个位置的元素进行交换,此时第一个位置为整组数据中最小的元素,可看做已排序区间,后面的数据可看做待排序区间,再从第二个位置的数据开始,找到未排序区间的最小元素放在第二个位置,依此方法直到完成整组数据的排序。

第二种方式同理,最后一个元素开始,依次从待排序区间找到最大值从后往前放,也可以实现整组数据有小到大排序。

原始数据:6	4	9	8	3
第一次扫描后:3	4	9	8	6
第二次扫描后:3	4	9	8	6
第三次扫描后:3	4	6	8	9
第四次扫描后:3	4	6	8	9	
排序完成......
时间复杂度:

无论最好情况和最坏情况,选择排序都需要找到最大值(或最小值),因此比较次数总为:n(n-1)/2,因此时间复杂度为:O(n^2)

空间复杂度:

只需要一个额外空间,是⼀个原地排序算法,空间复杂度为: O(1)

稳定性:

选择排序是以最大值或最小值直接与未排序的键值交换,数据排列顺序很有可能被改变,所以是:不稳定排序

适用场景:

适用于数据量较小或已经有部分数据进行过排序的情况。

代码:

第一种写法:
import java.util.Arrays;
/**
 * 选择排序
 * 时间复杂度:O(n^2)
 * 空间复杂度:O(1)
 * 稳定性:不稳定
 * */
public class SelectSort {
    public static void main(String[] args){
        int[] arr = {5,2,-6,8,-3,9,7,4,1,0,-5,3,6};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        MySelectSort(arr);
        System.out.println("System.out.println("MySelectSor-排序后:");");
        System.out.println(Arrays.toString(arr));
    }
    public static void MySelectSort(int[] arr){
        for(int i = 0;i<arr.length;i++){
            int minIndex = i;
            int tmp = 0;
            for(int j = i+1;j<arr.length;j++){
                if(arr[j]<arr[minIndex]){
                    minIndex = j;
                }
            }
            tmp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = tmp;
        }
    }
}
第二种写法:
    public static void MySelectSort(int[] arr){
        for(int i = arr.length-1;i>=0;i--){
            int maxIndex = i;
            int tmp = 0;
            for(int j = i-1;j>=0;j--){
                if(arr[j]>arr[maxIndex]){
                    maxIndex = j;
                }
            }
            tmp = arr[maxIndex];
            arr[maxIndex] = arr[i];
            arr[i] = tmp;
        }
    }

结果展示:

结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值