JAVA数据结构与算法,排序

Comparable接口

public class Student implements Comparable<Student>{
    private String usename;
    private int age;

    public String getUsename() {
        return usename;
    }

    public void setUsename(String usename) {
        this.usename = usename;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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


    @Override
    public int compareTo(Student o) {
        return this.getAge() - o.getAge();
    }
}
public class test {

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setUsename("张三");
        s1.setAge(18);

        Student s2 = new Student();
        s2.setUsename("李四");
        s2.setAge(20);

        Comparable max = getmax(s1, s2);
        System.out.println(max);
    }

    public static Comparable getmax(Comparable c1, Comparable c2){
        int result = c1.compareTo(c2);
        if(result >= 0){
            return c1;
        }else{
            return c2;
        }
    }
}

冒泡排序

public class Bubble {

    public static void sort(Comparable[] arr){
        for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (greater(arr[j], arr[j + 1])){
                    exch(arr, j, j + 1);
                }
            }
        }
    }

    public static boolean greater(Comparable c1, Comparable c2){
        return c1.compareTo(c2) > 0;
    }

    public static void exch(Comparable[] arr, int i, int j){
        Comparable temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


    public static void main(String[] args) {
        Integer[] arr = {8, 7, 6, 5, 4, 3, 2, 1};
        Bubble.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

}

选择排序

public class Selection {

    public static void sort(Comparable arr[]){
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if(greater(arr[minIndex], arr[j])){
                    minIndex = j;
                }
            }
            exch(arr, i, minIndex);
        }
    }


    public static boolean greater(Comparable c1, Comparable c2){
        return c1.compareTo(c2) > 0;
    }

    public static void exch(Comparable arr[], int i, int j){
        Comparable temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        Integer[] arr = {5, 4, 3, 2, 1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

插入排序

public class Insertion {

    public static void sort(Comparable arr[]){
        int i,j;
        for (i = 1; i < arr.length; i++) {
            if (greater(arr[i - 1], arr[i])){
               Comparable a = arr[i];
                for (j = i - 1; j >= 0; j--) {
                    if (greater(arr[j], a)){
                        arr[j + 1] = arr[j];
                    }else{
                        break;
                    }
                }
                arr[j + 1] = a;
            }
        }
    }

    public static boolean greater(Comparable c1, Comparable c2){
        return c1.compareTo(c2) > 0;
    }

    public static void main(String[] args) {
        Integer[] arr = {5, 4, 7, 8, 6, 3, 2, 1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
public class Insertion2 {
    public static void sort(Integer arr[]){
        int i,j;
        for (i = 1; i < arr.length; i++) {
            if (arr[i - 1] > arr[i]){
                Integer a = arr[i];
                for (j = i - 1; j >= 0; j--) {
                   if (arr[j] > a){
                       arr[j + 1] = arr[j];
                   }else{
                       break;
                   }
                }
                arr[j + 1] = a;
            }
        }
    }

    public static void main(String[] args) {
        Integer[] arr = {5, 4, 7, 8, 6, 3, 2, 1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

希尔排序

public class Shell {

    public static void sort(Integer[] arr){
        int i, j;
        for (int h = arr.length / 2; h >= 1; h /= 2){
            for(i = h; i < arr.length; i++){
                if (arr[i - h] > arr[i]){
                    Integer a = arr[i];
                    for (j = i - h; j >= 0; j -= h){
                        if (arr[j] > a){
                            arr[j + h] = arr[j];
                        }else{
                            break;
                        }
                    }
                    arr[j + h] = a;
                }
            }
        }

    }

    public static void main(String[] args) {
        Integer[] arr = {8, 5, 7, 6, 4, 2, 1, 3};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

归并排序

  • 搞了好久,第一个while循环的右括号加错地方了。。。
public class mergeSort {

    private static Integer[] arr;
    public static void mergesort(Integer[] a){
        arr = new Integer[a.length];
        int low = 0;
        int high = a.length - 1;
        mergesort(a, low, high);
    }

    private static void mergesort(Integer[] a, int low, int high) {
        if (low >= high){
            return;
        }
        int mid = (low + high) / 2;
        mergesort(a, low, mid);
        mergesort(a, mid + 1, high);
        merge(a, low, mid, high);
    }

    private static void merge(Integer[] a, int low, int mid, int high) {
        int i = low;
        int j = mid + 1;
        int k = low;
        while (i <= mid && j <= high) {
            if (a[i] <= a[j]) {
                arr[k++] = a[i++];
            } else {
                arr[k++] = a[j++];
            }
        }

        while (i <= mid){
            arr[k++] = a[i++];
        }

        while (j <= high){
            arr[k++] = a[j++];
        }

        //System.out.println(Arrays.toString(arr));  调试代码

        for (int l = low; l <= high; l++) {
            a[l] = arr[l];
        }
    }

    public static void main(String[] args) {
        Integer[] a = { 8, 7, 6, 5, 4, 2, 3, 1 };
        mergesort(a);
        System.out.println(Arrays.toString(a));
    }
}

快速排序

public class quick {

    public static void sort(Integer[] arr){
        int low = 0;
        int high = arr.length - 1;
        sort(arr, low, high);
    }

    private static void sort(Integer[] arr, int low, int high){
        if (low >= high){
            return;
        }

        int partition = Partition(arr, low, high);
        sort(arr, low, partition - 1);
        sort(arr, partition + 1, high);
    }

    private static int Partition(Integer[] arr, int low, int high) {
        int pivot = arr[low];
        while (low < high) {
            while (low < high && arr[high] >= pivot){
                high--;
            }

            arr[low] = arr[high];
            //low++;  多写了两行代码,导致数组越界异常

            while (low < high && arr[low] <= pivot){
                low++;
            }

            arr[high] = arr[low];
            //high--;
        }
        arr[high] = pivot;
        return high;
    }

 /*   private static int Partition(Integer[] arr, int low, int high) {
        int pivot = arr[low];
        int i = low;
        while (low < high) {
            while (low < high && arr[high] >= pivot){
                high--;
            }

            while (low < high && arr[low] <= pivot){
                low++;
            }
            int temp = arr[low];
            arr[low] = arr[high];
            arr[high] = temp;
        }
        arr[i] = arr[high];
        arr[high] = pivot;
        return high;
    }*/

    public static void main(String[] args) {
        //Integer[] arr = {8, 7, 6, 5, 4, 3, 1, 2};
        Integer[] arr = {4, 6, 8, 7, 2, 1, 3, 5};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值