选择排序泛型实现

选择排序

package com.example.main;

import com.example.bean.Student;

public class SelectionSort {
    private SelectionSort() {}

    public static <E extends Comparable<E>> void sort(E[] arr){
        //arr[0...i)是有序的;arr[i...n)是无序的
        for(int i=0;i<(arr.length-1);i++){
            //选择arr[i...n)中的最小值的索引
            int minIndex = i;
            for(int j=i; j<arr.length;j++){
                if(arr[j].compareTo(arr[minIndex])<0){
                    minIndex = j;
                }
            }
            swap(arr,i,minIndex);
        }
    }

    arr[i...n)是有序的;arr[0...i)是无序的;
    public static <E extends Comparable<E>> void reverseSort(E[] arr){
        for(int i=(arr.length-1);i>0;i--){
            //选择arr[0...i)中的最大值索引
            int maxIndex = i;
            for(int j=i-1;j>=0;j--){
                if(arr[j].compareTo(arr[maxIndex])>0){
                    maxIndex = j;
                }
            }
            swap(arr,i,maxIndex);
        }
    }

    private static<E> void swap(E[] arr,int i, int j){
        E t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    public static void main(String[] args) {
        Integer[] arr = {1,4,2,3,6,5};

        SelectionSort.sort(arr);
        for(int e:arr){
            System.out.print(e+" ");
        }
        System.out.println();

        SelectionSort.reverseSort(arr);
        for(int e:arr){
            System.out.print(e+" ");
        }
        System.out.println();

        Student[] students = {new Student("Alice",98),
                            new Student("Bobo",100),
                            new Student("Charles",66)
        };

        SelectionSort.sort(students);
        for(Student student : students){
            System.out.print(student+" ");
        }
        System.out.println();

        SelectionSort.reverseSort(students);
        for(Student student : students){
            System.out.print(student+" ");
        }
        System.out.println();
    }
}

package com.example.bean;

public class Student implements Comparable<Student>{
    private String name;
    private int score;

    public Student(String name,int score){
        this.name = name;
        this.score = score;
    }

    @Override
    public boolean equals(Object student) {
        if(this == student)
            return true;

        if(null == student)
            return false;

        if(this.getClass() != student.getClass()){
            return false;
        }

        Student another = (Student)student;
        return this.name.equals(another.name);
    }

    @Override
    public int compareTo(Student another) {
//        if(this.score < another.score){
//            return -1;
//        }
//        else if(this.score == another.score){
//            return 0;
//        }
//        else{
//            return 1;
//        }
//        return this.score - another.score;
        return this.score - another.score;
    }

    @Override
    public String toString() {
        return String.format("Student(name: %s,score: %d)",name,score);
    }
}

package com.example.test;

import com.example.main.SelectionSort;

public class SortingHelper
{
    private SortingHelper(){}

    public static <E extends Comparable<E>> boolean isSorted(E[] arr){
        for(int i=1;i< arr.length;i++){
            if(arr[i-1].compareTo(arr[i])>0){
                return false;
            }
        }
        return true;
    }

    public static <E extends Comparable<E>> void sortTest(String sortname,E[] arr){
        long startTime = System.nanoTime();
        if(sortname.equals("SelectionSort")){
            SelectionSort.sort(arr);
        }
        long endTime = System.nanoTime();

        double time = (endTime - startTime) / 1000000000.0;

        if(!SortingHelper.isSorted(arr))
            throw new RuntimeException("SelectionSort failed");
        System.out.println(String.format("%s , n = %d : %f s",sortname,arr.length,time));
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值