Python 每日一记222>>>Java实现选择排序算法及双层循环的理解

一、什么是选择排序?

我的理解:选择排序的精髓在于假定第一个索引处的元素为最小值,然后与后面的元素比较,如果小于后面的元素,则不进行操作,如果大于后面的元素,则将后面元素的索引作为最小值的索引,以这个最小值为基础,继续和后面的元素进行比较,直到比较完最后一个元素,此时会获得一个最小值的索引,然后将这个值与数组最开始的值互换,这算是完成了一次排序;接着进行第二次排序,此时第一个元素就不算了,从第二个元素开始,假定这个元素是最小值,与后面的元素比较,重复第一次排序的步骤,直到最后排序完成。
在这里插入图片描述

二、Java算法实现

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * 选择排序需要实现的方法包括:
 * 1--比较元素大小
 * 2--互换位置
 * 3--排序,先比较大小,再考虑是否互换位置
 */

//实现Comparable接口
class SelectSort {
//比较算法,如果大于零,表示a比b大.
// 注意Comparable接口类型可能让人能疑惑,
// 请记住父类接口指向子类实例,就懂了,类/接口是可以作为类型的
    public static boolean comparing(Comparable a,Comparable b){
        return a.compareTo(b)>0;
    }
//交换算法,要有一个临时变量进行传递
    public static void exchange(Comparable[]arr,int i,int j){
        Comparable temp;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
//排序
    public static void sort(Comparable[]arr){
//        第一层循环,表示要多少次选择排序,确定假定的最小值的索引
        for (int i=0;i<arr.length-1;i++){
//        第二层循环,确定要与假定的最小值比较的值的索引
//关于这两层循环的理解可参考下面的第三部分内容
			int minIndex=i;
            for (int j=i+1;j<arr.length;j++){
            //如果arr[minIndex]>arr[j],就将这个值得索引复制给最小值索引
                if(comparing(arr[minIndex],arr[j])){
                	minIndex=j; 
                }
            }
            //交换数据,将最小值和第一个值交换
            exchange(arr,i,minIndex);
        }
    }
}

public class Test{

    public static void main(String[] args) {
//        定义一个数组
        Integer[]arr={6,5,4,7,1,70,9,0};
        System.out.println("排序前的数组:"+Arrays.toString(arr));
//        调用方法,注意是静态方法,可以这样调用
        SelectSort.sort(arr);
        System.out.println("排序前的数组:"+Arrays.toString(arr));
    }
}

结果:
在这里插入图片描述

三、选择排序两层循环的理解

1、内层循环

先从内层循环开始理解,内层循环就是我们每次选择排序的情况,假设现在我们从最开始数组开始排序,首先minIndex=0,即第一个元素假定为最小值,然后将它与后面的值进行比较,思考这样一个问题,有n个元素的数组,minIndex=0的元素需要与后面哪些索引的元素比较?
答案是索引为0+1,0+2,0+3,,,,,0+n-1,所以内层循环就应该是:for (int j=0+1;j<n;j++),注意这里有一点需要注意,那么就是因为我们有多次选择排序,每次选择排序之后,下次排序就不会再将上次排序得到的最小的值包含在其中进行第二次排序的比较,所以我们的minIndex=0应该是变化的,而这个变化就和选择排序的次数相关,每选择排序一次,minIndex就应该加1,选择排序i次,minIndex就应该加i,而这个选择排序次数就和外层循环有关了。

2、外层循环

外层循环表示选择排序的次数,思考这样一个问题,有n个元素的数组,需要选择排序多少次?答案是n-1次,每次选择排序就是将剩下的最小的值放到最前,第一次,把最小的放到最前,第二次把第二小的放到第二个位置,第n-1次,把第二大的放到倒数第二个位置,此时选择排序已经完成,因为最大的数就是在最后一个位置了。所以外层循环就应该是:for (int i=0;i<arr.length-1;i++),这里arr.length就是数组元素个数n,在选择排序次数确定的情况下,内层循环就可以变为:for (int j=i+1;j<arr.length;j++)。

发布了235 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/105177798