zoukankan      html  css  js  c++  java
  • Java排序算法之直接选择排序

    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的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

  • 相关阅读:
    2017博普杯 东北大学邀请赛(B. Drink too much water)(贪心+树链剖分)
    AGC018D Tree and Hamilton Path(树+树的重心)
    BZOJ2843:极地旅行社
    P++ 1.0.5
    BZOJ1052:[HAOI2007]覆盖问题
    BZOJ3098:Hash Killer II
    BZOJ2784:[JLOI2012]时间流逝
    BZOJ2282:[SDOI2011]消防
    BZOJ1875:[SDOI2009]HH去散步
    Codeforces 504 A (Round #285 div.1 A) Misha and Forest
  • 原文地址:https://www.cnblogs.com/love-Stefanie/p/6636342.html
Copyright © 2011-2022 走看看