排序算法

1 选择排序

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。(有序集 || 无序集) --不稳定(值相同时会出现)

描述:首先在未排序序列找到一个最小值,并将其存放在排序序列的第一个位置。接着从未排序序列中找到一个最小值将其放入排序序列的末尾。依次类推,直到序列排序完毕。(当未排序序列中首位置不是最小时,将其与最小值的位置做交互,其余元素位置不变

例:3 , 5 ,2 , 4 , 7

第一次(3和2交换)     :  2  || 5   3   4   7
第二次(5和3交换)     :  2  3  ||  5   4   7
第三次(5和4交换)     :  2  3  4   ||  5   7
第四次(5最小,不交换) :  2  3  4   5  ||   7

注:剩余最后一个时,肯定最大,不需要再比。(||前为排序序列,||后为未排序)

算法实现

需要比较的学生实体

/**学生类
 * @author  zhoulk
 * date: 2019/5/17 0017
 */
@Getter
@Setter
public class Student implements Comparable{
    /**姓名*/
    private String name;
    /**年龄*/
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if(this.age.compareTo(((Student)o).age)>0){
            return 1;
        }
        if(this.age.compareTo(((Student)o).age)==0){
            if(this.name.compareTo(((Student)o).name)>0){
                return 1;
            }
        }
        return 0;
    }
}

比较类

/**desc:选择排序
 * @author  zhoulk
 * date: 2019/5/16 0016
 */
public class SelectSort<T> {

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{1,4,5,2,1,8,13,6,9};
        SelectSort<Integer[]> selectSort = new SelectSort();
        Integer[] returnArr = selectSort.sortAll(arr);

        System.out.println("直接使用引用对象-----------------------");
        for (Integer v:arr) {
            System.out.println(v+",");
        }

        System.out.println("使用泛型的返回值-----------------------");
        for (Integer v:returnArr) {
            System.out.println(v+",");
        }

        System.out.println("对象比较-----------------------");
        Student[] students = { new Student("Zhang", 20),
                new Student("Li", 23),
                new Student("Wang", 50),
                new Student("Liu", 17),
                new Student("Aiu", 17),
                new Student("Ma", 19)
        };
         selectSort.sortAll(students);
        for (Student v:students) {
            System.out.println(v+",");
        }
    }

    /**
     * 选择排序(从小到大)
     * @param arr 需要排序数组
     * @param <T> 结果
     * @return
     */
    public <T extends Comparable<T>> T[]  sortAll(T[] arr){
        if(arr==null||arr.length==0){
           return null;
        }

        //最后一次不需要再比
        for(int i = 0;i<arr.length-1;i++){
           //记录未排序元素最小值下标
           int minIndex = i;
           for(int j = i+1;j<arr.length;j++){
                if(arr[minIndex].compareTo(arr[j])>0){
                    minIndex = j;
                }
           }

            T temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        return arr;
    }

}

2 插入排序

描述:默认序列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值