算法之选择排序

选择排序

从学校到工作,用的最多的就是选择排序,最具讽刺的是用的还是交换次数最多的选择排序。虽然不是学软件的,也实在是汗颜啊。
算法第四版:

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

时间复杂度

交换次数是N次,比较次数是N的平方的二分之一。无法如何排序,比较次数都没变化。

与冒泡、插入排序相比

冒泡排序和插入排序的交换次数最坏都是N的平方的二分之一

例子

package com.java.arlgorithm.sort;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * @author
 */
@Slf4j
public class ChooseInserTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 6, 4, 3, 1, 6};
        chooseInsert(array);
    }

    //交换次数太多
    public static void chooseInsertBad(int[] array) {
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int tmp = array[i];
            for (int j = i + 1; j < len; j++) {
                if (less(array[j], tmp)) {
                    swap(array, i, j);
                }
            }
            printAll(array);
        }

    }

    public static void chooseInsert(int[] array) {
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int min = i;
            for (int j = i + 1; j < len; j++) {
                if (less(array[j], array[min])) {
                    min = j;
                }
            }
            swap(array, i, min);
            printAll(array);
        }

    }

    public static void swap(int[] array, int src, int des) {
        int tmp;
        tmp = array[src];
        array[src] = array[des];
        array[des] = tmp;
    }

    public static void printAll(int[] array) {
        log.info(Arrays.toString(array));
    }

    public static boolean less(int a, int b) {
        if (a < b) {
            return true;
        }
        return false;
    }
}


结果

2019-08-20 15:51:56,687   [main] INFO  ChooseInserTest  - [1, 6, 4, 3, 5, 6]
2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 6, 5, 6]
2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 6, 5, 6]
2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
2019-08-20 15:51:56,693   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
posted @ 2019-08-20 15:53  碧海潮心  阅读(103)  评论(0编辑  收藏  举报