排序算法之选择排序

来源:互联网 发布:失业金数据与非农数据 编辑:程序博客网 时间:2024/06/07 23:04
 选择排序,顾名思义是通过一种选择的方式对一组无序数列进行排序。那么,选择什么呢?选择出来什么之后又该如何排序?我们来重点讨论一下:
    首先,我们来谈谈选择排序的原理,很简单的:从一组无序数列中选择一个最小值(最大值也可以,相应调整即可),把这个数放置在数列的首位,可以直接和第一位交换,此时原数列分为有序区和无序区两块,对无序区做相同的动作,无序区继续分为有序区和无序区两块......,就这样做下去,当无序区元素剩余为1时,算法结束。怎么样,有么有很简单。
    现在,我们来找出这个算法要做的具体工作:
1.找到最小元素
2.将它与第一个元素交换,当然如果他就是第一个,就省略了。之所以直接与第一个元素交换,是因为这样做,挪动的元素最少。
3.重复1,2。
    好的,来实现一下,上代码:
//
    private int minLocation(int[] list,int firstint last){
        int minIndex//
        int loc//
        minIndex = first;
        
        for(loc = first + 1loc <= lastloc++){//
            if(list[loc< list[minIndex])
                minIndex = loc;
        }
        return minIndex;
    }
    
    //
    private void swap(int[] list,int firstint second){
        int temp;
        
        temp = list[first];
        list[first= list[second];
        list[second= temp;
    }
    
    //
    public void selectSort(int[] list){
        int locminIndex;
        
        for(loc = 0loc < list.length -1loc++){ //1
            minIndex = minLocation(listloclist.length -1);//
            swap(listlocminIndex);//
        }
    }
 最后,我们来分析一下时间复杂度:
先贴一句话时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)(来自http://blog.csdn.net/firefly_2002/article/details/8008987),那么在这个算法中受n变化影响最大的就是涉及到循环的语句了,有两句:
1. 
minIndex = minLocation(listloclist.length -1);//
2.
swap(listlocminIndex);// 
假设list.length = n,那么,外循环执行(n-1)次
在swap()中的三句赋值语句每次循环执行一次,所以执行次数为3(n-1)
在minLocation()中,内循环执行(n-1-i)次,所以总执行次数是(n-1)+(n-2)+...+2+1= n*(n-1)/2 = 
1/2(n^2)-1/2(n) = 1/2(n^2)+O(n) = O(n^2).
即就是,如果n= 1000时,执行总次数为1/2 * 1000^2 - 1/2 * 1000 = 499500,约等于50万次。
好了本篇文章到此结束,下篇再见。
0 0
原创粉丝点击