排序算法——选择排序plus

选择排序

时间复杂度:O(n^2)
最坏时间复杂度 O(n^2)
最好时间复杂度 O(n^2)
不稳定

由于后面的算法都有的功能,我将此抽取出来作为公共的方法了,有打印数组和交换数组的两个值
基本代码如下:

package cn.xiaov;

public class Common {
    //数组值交换
    public static void swap(int[] arr ,int i ,int j ){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    //打印数组
    public static void print(int[] arr){
        for (int o :arr) {
            System.out.print(o + " ");
        }
        System.out.println();
    }
}

常见的选择排序的算法代码:

private static void sort2(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
          int minPos = i;
          for (int j = i + 1; j < arr.length; j++) {
              minPos = arr[minPos] > arr[j] ? j : minPos;
          }
          Common.swap(arr, i, minPos);
          System.out.print("选择排序:第" + (i + 1) + "轮之后,数组的顺序:");
          Common.print(arr);
    }
}

示例数组:int[] arr = {8,6,4,1,5,7,9,2,3};
运行结果:

选择排序:第1轮之后,数组的顺序:1 6 4 8 5 7 9 2 3 
选择排序:第2轮之后,数组的顺序:1 2 4 8 5 7 9 6 3 
选择排序:第3轮之后,数组的顺序:1 2 3 8 5 7 9 6 4 
选择排序:第4轮之后,数组的顺序:1 2 3 4 5 7 9 6 8 
选择排序:第5轮之后,数组的顺序:1 2 3 4 5 7 9 6 8 
选择排序:第6轮之后,数组的顺序:1 2 3 4 5 6 9 7 8 
选择排序:第7轮之后,数组的顺序:1 2 3 4 5 6 7 9 8 
选择排序:第8轮之后,数组的顺序:1 2 3 4 5 6 7 8 9 

选择排序改进

改进思路:对比原算法构造一个指针,改进后构造两个指针,minPos和maxPos,分别找出最大值和最小值位置,时间缩短为一半

private static void sort2(int[] arr) {
    for (int i = 0; i < arr.length / 2 ; i++) {
         int minPos = i;
         int maxPos = arr.length - 1 - i;
         for (int j = i; j < arr.length - i; j++) {
             minPos = arr[j] > arr[minPos] ? minPos : j;
             maxPos = arr[j] > arr[maxPos] ? j : maxPos;
         }
         swap(arr, i, minPos);
         maxPos = i == maxPos ? minPos : maxPos;
         swap(arr, arr.length - 1 - i, maxPos);
         System.out.print("选择排序增强后:第" + (i + 1) + "轮之后,数组的顺序:");
         print(arr);
     }
 }

运行结果:

选择排序增强后:第1轮之后,数组的顺序:1 6 4 8 5 7 3 2 9 
选择排序增强后:第2轮之后,数组的顺序:1 2 4 6 5 7 3 8 9 
选择排序增强后:第3轮之后,数组的顺序:1 2 3 6 5 4 7 8 9 
选择排序增强后:第4轮之后,数组的顺序:1 2 3 4 5 6 7 8 9 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值