zoukankan      html  css  js  c++  java
  • 选择排序

    选择排序对冒泡排序进行了改进,将交换次数从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),不过选择排序交换的次数比冒泡排序要少,所以相比冒泡排序,效率要高一些。

  • 相关阅读:
    洛谷P3157 [CQOI2011]动态逆序对
    CDQ分治
    快速数论变换(NTT)
    洛谷P3338 [ZJOI2014]力
    洛谷 P1919 A*B Problem升级版
    0-1分数规划
    洛谷P4593 [TJOI2018]教科书般的亵渎
    拉格朗日插值
    20180912-3 词频统计
    20190912-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/51life/p/10307217.html
Copyright © 2011-2022 走看看