排序算法总结之直接选择排序

来源:互联网 发布:淘宝自拍风格技巧 编辑:程序博客网 时间:2024/04/28 19:28

概念

每一趟在最后的n-i+1(i=1,2,...,n-1)中取最小的记录作为有序表的第i个记录

   

动态效果:

  

优点:算法简单,容易实现

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


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


0 0
原创粉丝点击