【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】-????选择排序

定义:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

在这里插入图片描述
这里先给大家这个简单比较容易理解的版本:

public void selectSort(int[] array){
        for(int i=0;i<array.length;i++){
            int minindex=i;
            for(int j=i+1;j<array.length;j++){
                if(array[minindex]>array[j]){
                    minindex=j;
                }
            }
            swap(array,minindex,i);
        }
    }
    public void swap(int[]array,int i,int j){
        int tmp=array[i];
        array[i]=array[j];
        array[j]=tmp;
    }

进行测试:
完成测试
测试成功!!!

????当然我们还有一种选择排序的另一种实现方法,我们每次遍历的时候,都选择两个元素,一个是这次遍历的最小元素,一个是最大的元素,分别放到数组的最左和最有端,然后就和上面的逻辑一样,继续遍历,更新最大值和最小值,遍历结束。

这里也把代码给大家,这端代码说起来简单,但是还是有很多的小细节的,大家细细品味一下。

public void selectSort2(int[] array) {
        int left=0;
        int right=array.length-1;
        while(left<right){
            int minIndex=left;
            int maxIndex=left;
            for(int i=left;i<right;i++){
               if(array[i]>array[maxIndex])  maxIndex=i;
               if(array[i]<array[minIndex])  minIndex=i;

            }
            swap(array,minIndex,left);
            //[10,6,4,8,7]这个例子大家按照代码的逻辑画个图
            //就会发现,排序失败原因是maxIndex==left我们在
            //第一次交换之后就会把maxIndex对应的值交换到minIndex中了
            //所以必须加一个判断
            if(left==maxIndex)  maxIndex=minIndex;
            swap(array,maxIndex,right);
            left++;
            right--;
        }
    }

我把需要注意的地方注释出来了,希望大家还是可以自己在纸上画一下,这样会对整个过程有一个更加全面的认识。

1.直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

上一篇:SpringBoot配置HTTPS及开发调试-后端配置


下一篇:Redis系列-2 Redis持久化机制-1.RDB