Selection Sort(选择排序)

来源:互联网 发布:打开淘宝网首页 编辑:程序博客网 时间:2024/05/15 23:47

基本思路:
1.找到未排序的数组中最小的那个元素,用下标为min来标记此为最小的元素
2.将它和未排序数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)
3.如此往复,直到将整个数组排序。

public class Selection {    //排序    public static void sort(Comparable[] a)    {        int N = a.length;        for(int i=0;i<N;i++)//总共比较多少趟,每一趟确定前面的一个数据        {            int min = i;//假设最小数据是未排序中的第一个数据            for(int j=i+1;j<N;j++)//这一趟需要比较的次数            {                if(less(a[j],a[min]))//如果比假设的最小数小                    min = j;//则将其下标标记为最小数的下标,内层循环找到最小数的下标            }            exch(a,i,min);//交换最小数和未排序的第一个数据的位置        }    }    //比较大小    private static boolean less(Comparable v,Comparable w)    {        return v.compareTo(w) < 0;    }    //交换    private static void exch(Comparable[] a,int i,int j)    {        Comparable swap = a[i];        a[i] = a[j];        a[j] = swap;    }    //测试    public static void main(String[] args) {        Scanner cin = new Scanner(System.in);         int N = cin.nextInt();        Integer[] a = new Integer[N];        for(int i=0;i<N;i++)        {            a[i] = cin.nextInt();        }        sort(a);        for(int i=0;i<a.length;i++)            System.out.print(a[i]+" ");    }}

时间复杂度分析
寻找开销:和输入序列本身无关,它总是要查看所有项来寻找最小项。所以为平方时间
移动开销:每一个元素只需要交换一次就到最终位置,线性次数的交换。
最大的问题在于如果序列本身就是有序的,那么它还是会一遍遍的找最小项。

0 0
原创粉丝点击