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排序结果,,直接选择排序是不稳定。


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

  • 相关阅读:
    网络编程- struct模块定制报头ftp实践(九)
    网络编程- strcuct模块定制报头的理论(八)
    SQL查询原理及执行顺序
    web应用的组成结构
    web开发相关知识介绍
    java--调整JVM内存的大小
    java中的泛型系列五:自定义泛型
    java中的反射技术系列四:反射类的字段
    Android Sharedpreference
    Android OnScrollListener
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4725281.html
Copyright © 2011-2022 走看看