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

概念

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


您的关注是我坚持写作的动力,如果觉得有用,欢迎关注我的微信,海量学习资源免费送!

你的关注是对我最大的鼓励!



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值