排序算法(二):选择排序

一、 基本思想

选择排序是一种简单的直观的排序算法,基本原理如下:对于给定的一组记录,经过一轮比较后得到最小的记录,然后将该记录的位置与第一个记录的位置交换;接着对不包括第一个记录以外的其他记录进行第二次比较,得到最小记录并与第二个位置记录交换,重复该过程,直到进行比较的记录只剩下一个为止‘

二、复杂度分析

从简单排序的过程来看,他最大的特点是交换移动数据相当少,这样节约了相应的时间。分析它的时间复杂度发现,无论是最好还是最差情况,其比较次数都是一样多的。第i趟排序需要进行n-i次关键字比较。此时需要比较次数是

n-1+n-2+...+1=n(n-1)/2

n(n-1)/2,对于交换次数而言,当最好的时候,交换0次,最差的时候,也就是初始O(n2)
降时,交换次数为 n-1 次,基于最终的时间排序与交换次数总和,因此,总的时间复杂度依然为O(n2)。
尽管与冒泡排序同为O(n2),但简单选择排序的性能要优于冒泡排序。

三、排序过程如下

以数组{49,38,65,97,76,13,27,49}为例,
这里写图片描述

四、java实现

public class SelectSort {

    public static void selectSort(int[] a) {
        if (a == null || a.length <= 0) {
            return;
        }
        for (int i = 0; i < a.length; i++) {
            int temp = a[i];
            int flag = i; // 将当前下标定义为最小值下标
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] < temp) {// a[j] < temp 从小到大排序;a[j] > temp 从大到小排序
                    temp = a[j];
                    flag = j; // 如果有小于当前最小值的关键字将此关键字的下标赋值给flag
                }
            }
            if (flag != i) {
                a[flag] = a[i];
                a[i] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int a[] = { 49,38,65,97,76,13,27,49 };
        selectSort(a);
        System.out.println(Arrays.toString(a));
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_34288630/article/details/79875827