算法排序-选择排序

「扫码关注我,面试、各种技术(mysql、zookeeper、微服务、redis、jvm)持续更新中~」
在这里插入图片描述

数据结构和算法是程序设计的灵魂,所以我们需要掌握基本的排序算法。
在这里插入图片描述
我们首先来聊选择排序,比如有一个数组,我们需要按照从小到大顺序进行排序,选择排序的思想在于从下标为0开始,依次向后遍历,寻找比下标为0的数据还小的数据放在下标为0的位置上,依此类推,下次取下标为1的数据继续向后遍历,寻找比下标为1的数据要小的数据放在下标1的位置上。那么核心在于每次选取下标位置上,废话不多说,上程序:

/**
 * @Description: 选择排序(取最小数据下标)
 * @Auther: wenqi
 */
public class SelectionSort {
    public static void main(String[] args) {
        int arr[] = {5,1,3,2,4,7,9,8,6};

        for(int i=0;i<arr.length;i++){
            //记录最小的下标位置
            int minPos = i;

            //循环遍历获取最小数据的下标位置
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[minPos]){
                    minPos = j;
                }
            }

            //和最小数据换位置
            int temp = arr[i];
            arr[i] = arr[minPos];
            arr[minPos]=temp;

            //打印每次排序结果
            for(int k=0;k<arr.length;k++){
                System.out.print(arr[k] + " ");
            }
            System.out.println();
        }
    }
}

执行结果如下:

1 5 3 2 4 7 9 8 6 
1 2 3 5 4 7 9 8 6 
1 2 3 5 4 7 9 8 6 
1 2 3 4 5 7 9 8 6 
1 2 3 4 5 7 9 8 6 
1 2 3 4 5 6 9 8 7 
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 

我们可以看出9个数据组成的数组执行了9次才能排序成功(当然可以减少一次比对),如果数据量大的话,那么比对的次数也会跟着增多。我们可以思考是不是有更有效的方式来减少数据移动的次数呢?我们可不可以每次选出一个最小数,一个最大数放到开始和末尾的位置,这样的话就可以减少一半的比对,上代码:

/**
 * @Description: 选择排序优化(每次取一个最小、最大下标)
 * @Auther: wenqi
 */
public class SelectionSort1 {
    public static void main(String[] args) {
        int arr[] = {5, 1, 3, 2, 4, 7, 9, 8, 6};

        for(int i=0;i<arr.length/2;i++){
            //定义最小、最大下标
            int minPos = i;
            int maxPos = arr.length-1-i;

            //循环遍历获取最小、最大数据的下标位置
            for(int j=i+1;j<arr.length-i;j++){
                if(arr[j]<arr[minPos]){
                    minPos = j;
                }else if(arr[j]>arr[maxPos]){
                    maxPos = j;
                }
            }

            //和最小数据换位置
            int temp = arr[i];
            arr[i] = arr[minPos];
            arr[minPos]=temp;

            //和最大数据换位置
            int temp1 = arr[arr.length-1-i];
            arr[arr.length-1-i] = arr[maxPos];
            arr[maxPos]=temp1;

            //System.out.println("minPos:"+minPos+"|maxPos:"+maxPos);

            //打印每次排序结果
            for(int k=0;k<arr.length;k++){
                System.out.print(arr[k] + " ");
            }
            System.out.println();
        }
    }
}

执行结果如下:

1 5 3 2 4 7 6 8 9 
1 2 3 5 4 7 6 8 9 
1 2 3 5 4 6 7 8 9 
1 2 3 4 5 6 7 8 9 

怎么样,是不是感觉相当棒,其实代码可以进行提炼,但是为了展示具体排序细节,就不提炼了。优化无止境!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值