Java 七大排序之选择排序

(1)基本思想

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

具体来说就是在元素集合array[i]--array[n-1]中选择最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换, 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。

(2)代码实现

1.方法1:

 遍历数组,依次比较array[i]和array[j]的值大小

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

swap为一个交换函数,当需要交换array[i]和array[j]时调用即可。

(2)方法2:

如果array[i] < array[minIndex], minIndex = i;如果array[i] > array[maxIndex] ,则maxIndex = i。

此时找到了最大值和最小值下标,交换最小值下标为left,最大值下标为right。然后 left++,    right--。

如果left对应的值就是maxIndex,此时我们需要修正一下最大值和最小值的位置。

 public static 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+1; i <= right; i++) {
                if (array[i] < array[minIndex]) {
                    minIndex = i;
                }
                if (array[i] > array[maxIndex]) {
                    maxIndex = i;
                }
            }
            swap(array,minIndex,left);
            if (maxIndex == left){
                maxIndex = minIndex;
            }
            swap(array,maxIndex,right);
            left++;
            right--;
        }
 }

(3)特性总结

1.直接选择排序由于需要遍历两边数组,因此效率不高,我们实际用的也很少

扫描二维码关注公众号,回复: 16758987 查看本文章

2. 时间复杂度:O(N^2),空间复杂度:O(1)

3. 稳定性:不稳定

如果对以上内容有问题的欢迎在评论区留言哦!

猜你喜欢

转载自blog.csdn.net/m0_56911648/article/details/130804690