选择排序

220 阅读1分钟

以将数组中的数据进行从小到大排列为例,选择排序的主要做法就是每次遍历从剩余的数据中选择出最小的一个数,按照顺序和前边的数据进行交换,直到排序完毕。

举个例子,对一下数组内的数据进行从小到大的排序:

[3,2,8,4,9,5,6,1,7]

最终的排序结果是:

[1,2,3,4,5,6,7,8,9]

具体的排序步骤如下图,每一步排序完之后前面的都是已经排好序的:

image.png

具体的代码实现如下:

public class SelectionSort {

    public static void main(String[] args) {
        int[] arr = {3,2,8,4,9,5,6,1,7};
        System.out.println(Arrays.toString(selection_sort(arr)));
    }

    private static int[] selection_sort(int[] arr){

        for (int i=0; i<arr.length; i++){
            int min = i;
            for (int j=i+1; j<arr.length; j++){
                if (arr[j] < arr[min]){
                    min = j;
                }
            }

            if (i != min){
                swap(arr,i,min);
            }
        }
        return arr;
    }

    private static void swap(int[] arr,int i,int min){
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

具体的时间复杂度怎么算呢?

  • 第一步,需要从N个数中选出最小值进行交换,最差需要进行N-1次比较
  • 第二步,需要从N-1个数中选出最小值进行交换,最差需要进行N-2次比较
  • 第三步,需要从N-2个数中选出最小值进行交换,最差需要进行N-3次比较
  • ......以此类推

最终的时间复杂度结果是一个等差数列,前N项求和,Sn=n*a1+n(n-1)d/2= An^2 + Bn 那么时间复杂度为 O(N^2)