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

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/love-Stefanie/p/6636342.html
Copyright © 2020-2023  润新知