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

    概念

    每次旅行到最后n-i+1(i=1,2,...,n-1)取纪录最年轻的排序列表i记录

       

    动态效果:

      

    长处:算法简单,easy实现

    缺点:每次仅仅能确定一个元素


    Java实现:

    package com.liuhao.sort;
    
    import java.util.Arrays;
    
    //定义一个数据包装类
    class DataWrap implements Comparable<DataWrap>{
    
        int data;
        String flag;
       
        public DataWrap(int data, String flag) {
            this.data = data;
            this.flag = flag;
        }
    
        public String toString(){
            return data + flag;
        }
    
        @Override
        public int compareTo(DataWrap dw) {
            return this.data > dw.data ?
                    1 : (this.data == dw.data ?

    0 : -1); } } public class SelectSort { public static void selectSort(DataWrap[] data){ System.out.println("開始排序"); int arrayLength = data.length; //依次进行n-1次比較。第i趟比較将第i大的值选出放在i位置上 for(int i=0; i<arrayLength-1; i++){ for(int j=i+1; j<arrayLength; j++){ //i上的数据>j上的数据 if(data[i].compareTo(data[j]) > 0){ DataWrap tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } System.out.println("第" + (i+1) + "趟排序后:" + Arrays.toString(data)); } } public static void main(String[] args) { DataWrap[] data = { new DataWrap(21, "") ,new DataWrap(30, "") ,new DataWrap(49, "") ,new DataWrap(30, "*") ,new DataWrap(16, "") ,new DataWrap(9, "") }; System.out.println("排序之前:" + Arrays.toString(data)); selectSort(data); System.out.println("排序之后:" + Arrays.toString(data)); } }

    执行上面的程序,能够看出下图的排序效果:

    image

    直接选择排序每趟仅仅需选出最小的数据。并将其放在本趟首位就可以。能够发现。事实上每趟仅仅需进行一次交换就可以。而上述算法在每趟的比較中,进行了不止一次的交换。


    改进算法:

    //依次进行n-1次比較。第i趟比較将第i大的值选出放在i位置上
            for(int i=0; i<arrayLength-1; i++){
                //minIndex用于保留本趟中最小值的索引
                int minIndex = i;
                for(int j=i+1; j<arrayLength; j++){
                   
                    //i上的数据>j上的数据
                    if(data[minIndex].compareTo(data[j]) > 0){
                        minIndex = j;
                    }
                }
               
                if(minIndex != i){
                    DataWrap tmp = data[i];
                    data[i] = data[minIndex];
                    data[minIndex] = tmp;
                }
               
                System.out.println("第" + (i+1) + "趟排序后:" + Arrays.toString(data));
            }

    每趟比較的目的是找出本趟中最小数据的索引(minIndex)。

    image


    算法分析

    对于直接选择排序,数据交换的次数最多要n-1次,但比較的次数较多,时间复杂度为O(n2),空间复杂度仅为O(1)。

    从上面两个data至30的DataWrap排序结果,,直接选择排序是不稳定。


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4725281.html
Copyright © 2011-2022 走看看