[算法 java] 选择排序selectSort

来源:互联网 发布:国潮是什么意思 知乎 编辑:程序博客网 时间:2024/05/24 01:41

算法描述

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

例子

以下面5个无序的数据为例:
56 12 80 91 20(文中仅细化了第一趟的选择过程)
第1趟:12 56 80 91 20
select
第2趟:12 20 80 91 56

第3趟:12 20 56 91 80

第4趟:12 20 56 80 91

算法分析

时间复杂度
选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2。舍去最高项系数,其时间复杂度为 O(N^2)

空间复杂度
O(1) 用于交换和记录索引

稳定性:不稳定(比如序列[5, 5, 3]第一趟就将第一个5与3交换,导致第一个5挪动到第二个5后面

算法实现

算法第四版的类似实现

public static void selectSort4(int[] arr){        for(int i = 0, len = arr.length; i < len; i++){            int minIndex = i; //默认将当前索引设为最小值            for(int j = i + 1; j < len; j++){                if(arr[j] < arr[minIndex]){                    minIndex = j; //如果索引后的值比当前索引值小,替换索引                }            }            //交换最小索引和当前索引i的值            int temp = arr[minIndex];            arr[minIndex] = arr[i];            arr[i] = temp;        }    }

仔细思考了一下,上述实现不是最优实现
原因有两点:
当外层循环循环到(len -1)时就不用继续循环了
当当前索引i是最小值是不用交换

所以参考了网上的资料发现自己的思考是对的,改进代码如下:

public static void selectSort(int[] arr){        for(int i = 0, len = arr.length; i < len - 1; i++){//只需要循环到len-1也就是数组的倒数第二个索引            int minIndex = i;            for(int j = i + 1; j < len; j++){                if(arr[j] < arr[minIndex]){                    minIndex = j;                }            }            if(minIndex != i){//判断如果minIdex 不是当前索引才交换                int temp = arr[minIndex];                arr[minIndex] = arr[i];                arr[i] = temp;            }        }    }
1 0
原创粉丝点击