• 选择排序


    选择排序对冒泡排序进行了改进,将交换次数从O(n2)降低到了O(n),比较次数仍然是O(n2)

    情景:对数组 int[] arr = {6,9,5,2,8,7}中的数据 从小到大排序。

    思路:在第一趟排序中,从下标为0开始选择出最小的数字,和arr[0]进行交换,此时,最左侧的数字已经是有序状态了。在第二趟排序中,从下表为1开始选择出最小的数字,然后和arr[1]进行交换,以此类推。注意,红色数字表示已排序。

    第一趟排序后: 2 5 6 8 7 9

    第二趟排序后: 2 5 6 8 7 9

    第三趟排序后: 2 5 6 8 7 9

    第四趟排序后: 2 5 6 7 8 9

    第五趟排序后: 2 5 6 7 8 9 

    代码:

    /**
     * 选择排序
     * @author D N
     *
     */
    public class SelectSort {
        private long[] a; 
        private int nElems;
        
        public SelectSort(int max){
            a = new long[max];
            nElems = 0;
        }    
        
        public void insert(long value){
            a[nElems] = value;
            nElems++;
        }
        
        public void display(){
            for(int j=0;j<nElems;j++){
                System.out.print(a[j]+"   ");
            }
            System.out.println("");
        }
        
        public void swap(int one,int two){
            long temp = a[one];
            a[one] = a[two];
            a[two] = temp;
        }
        
        //选择排序算法
        public void selectSort(){
            int in,out,min;
            for(out = 0;out < nElems-1;out++){
                min = out;
                for(in = out+1;in < nElems;in++){
                    if(a[in] < a[min]){
                        min = in;
                    }
                }
                swap(out, min);
            }
        }
        
    }

    运行测试代码:

    public class SortTest {
        public static void main(String[] args) {
            int maxSize = 10;
            SelectSort arr = new SelectSort(maxSize);
            arr.insert(6);
            arr.insert(9);
            arr.insert(5);
            arr.insert(2);
            arr.insert(8);
            arr.insert(7);
            arr.display();
            arr.selectSort();
            arr.display();
        }
    }

    结果:

    6   9   5   2   8   7   
    2   5   6   7   8   9   

    效率分析:

    选择排序的时间复杂度是O(n2),不过选择排序交换的次数比冒泡排序要少,所以相比冒泡排序,效率要高一些。

  • 相关阅读:
    如何判断两个IP是否在同一网段
    http://blog.csdn.net/a9529lty/article/details/6454156
    http://blog.csdn.net/a9529lty/article/details/6454145
    tomcat下配置https环境(windows环境)
    hosts文件配置及主要作用
    函数y=sin(1/x)曲线
    求证:a^4+b^4 ≧a^3*b+a*b^3
    三种双二次曲线
    已知m和n是两个整数,并且m^2+mn+n^2能被9整除,试证m,n都能被3整除。
    x为正变数,求y=x^3/(x^4+4)的最大值
  • 原文地址:https://www.cnblogs.com/51life/p/10307217.html
Copyright © 2020-2023  润新知