首页 > 技术文章 > Java排序算法之直接选择排序

love-Stefanie 2017-03-28 18:58 原文

Java排序算法之直接选择排序

基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上。第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

Java代码实现:

 

public class Xuanze {
    public static void main(String[] args) {
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            for(int j=i+1;j<s.length;j++){
                if(s[i]>s[j]){
                    temp=s[i];
                    s[i]=s[j];
                    s[j]=temp;
                }
            }
        }
        for(int value:s)
        System.out.print(value);    
    }
}

 

上面排序方法存在效率问题。因为当我们发现当前数比被比较数小的时候我们就交换两个数,其实我们可以把当前数的位置保存下来,等到第一次比较完后在进行交换。

public class Xuanze {
    
    public static void main(String[] args) {
        
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            temp = i;
            for(int j=i+1;j<s.length;j++){
                if(s[temp]>s[j]){
                    temp=j;  //保存位置
                }
            }
            if(temp!=i) exchang(s,i,temp);  //进行交换
        }
        for(int value:s)
        System.out.print(value);        
    }

    private static void exchang(int[] s, int i, int j) {
        int temp = s[j];
        s[j]=s[i];
        s[i]=temp;    
    }
}

算法性能分析:

时间复杂度:假设有n个数据,数据交换的次数最多为n-1次,但程序的总体的比较次数较多。所以综合考虑有直接选择排序的时间复杂度为O(n2)

       (n的平方)。所以当记录占用字节数较多时,通常比直接插入排序的执行速度快些。

空间复杂度:直接选择排序的空间复杂度很好,它只需要一个附加单元用于数据交换,所以其空间复杂度为O(1)。

稳定性:在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

 

推荐阅读