java排序算法总结

排序接口

package com.sintor.xxx.sort.service;

public interface Sort {
    int[] sort(int[] arr);
}

归并排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//归并排序
public class MergeSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        //递归
        split(arr, 0, l - 1);

        return arr;
    }

    private void split(int[] arr, int left, int right) {
        //单个数据不处理
        if (left == right) {
            return;
        }

        //获取中间下标
        int mid = left + ((right - left) >> 1); //关键理解
        split(arr, left, mid);
        split(arr, mid + 1, right);

        //合并两组数据
        merge(arr, left, mid, right);
    }

    private void merge(int[] arr, int left, int mid, int right) {
        int[] ts = new int[right - left + 1];
        int n = 0;

        int lal = left;
        int ral = mid + 1;

        //左右混合处理
        while (lal <= mid && ral <= right) {
            ts[n++] = arr[lal] > arr[ral] ? arr[ral++] : arr[lal++];
        }

        //处理左数组
        while (lal <= mid) {
            ts[n++] = arr[lal++];
        }
        //处理右数组
        while (ral <= right) {
            ts[n++] = arr[ral++];
        }

        //处理原数组
        System.arraycopy(ts, 0, arr, left, ts.length);
    }
}

快速排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//快速排序
public class QuickSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        //递归
        split(arr, 0, l - 1);

        return arr;
    }

    private void split(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = getMid(arr, left, right);
        split(arr, left, mid - 1);
        split(arr, mid + 1, right);

    }

    private int getMid(int[] arr, int left, int right) {

        //选取中轴
        int mid = arr[left];
        int al = left + 1;
        int ar = right;

        while (true) {
            //向右找第一个大于中轴的元素下标
            while (al <= ar && arr[al] <= mid) {
                al++;
            }

            //向左找第一个小于中轴的元素下标
            while (al <= ar && arr[ar] >= mid) {
                ar--;
            }

            if (al >= ar) {
                break;
            }
            swap(arr, al, ar);
        }
        arr[left] = arr[ar];
        arr[ar] = mid;
        return ar;
    }

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

选择排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//选择排序
public class SelectSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }

        int l = arr.length;

        for (int i = 0; i < l - 1; i++) {
            for (int j = i + 1; j < l; j++) {
                if (arr[i] > arr[j]) {
                    swap(arr, i, j);
                }
            }
        }


        return arr;
    }

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

冒泡排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//冒泡排序
public class BubbleSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        for (int i = l - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }

        return arr;
    }

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

}

插入排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//插入排序
public class InsertSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }

        int l = arr.length;

        for (int i = 1; i < l; i++) {
            insert(arr, i);
        }
        return arr;
    }


    private void insert(int[] arr, int n) {
        int t = arr[n];
        int i;
        for (i = n - 1; i >= 0 && t < arr[i]; i--) {
            arr[i + 1] = arr[i];
        }
        arr[i + 1] = t;
    }
}

希尔排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//希尔排序
//插入排序变种
public class ShellSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;
        //分组
        for (int g = l / 2; g > 0; g = g / 2) {
            //处理各个分组
            for (int i = g; i < l; i++) {
                //从i下标元素开始将对应元素插入对应分组
                insert(arr, g, i);
            }
        }

        return arr;
    }

    private void insert(int[] arr, int g, int n) {
        int t = arr[n];
        int i;
        for (i = n - g; i >= 0 && t < arr[i]; i -= g) {
            arr[i + g] = arr[i];
        }
        arr[i + g] = t;
    }
}

计数排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//计数排序
public class CountSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        //场景:数据是正整数 数据值相差不大

        //获取数组最大值
        int m = arr[0];
        for (int i = 1; i < l; i++) {
            if (m < arr[i]) {
                m = arr[i];
            }
        }

        //计数数组
        int[] ts = new int[m + 1];
        for (int j : arr) {
            ts[j]++;
        }

        //修改原数组
        int n = 0;
        for (int i = 0; i < ts.length; i++) {
            for (int j = ts[i]; j > 0; j--) {
                arr[n++] = i;
            }
        }

        return arr;
    }
}

堆排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

//堆排序
public class HeapSort implements Sort {


    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }

        int l = arr.length;

        //生成大顶堆
        for (int i = l / 2 - 1; i >= 0; i--) {
            adjust(arr, i, l);
        }
        for (int i = l - 1; i > 0; i--) {
            swap(arr, 0, i);
            adjust(arr, 0, i);
        }

        return arr;
    }

    private void adjust(int[] arr, int i, int l) {

        //当前节点值
        int n = arr[i];
        for (int j = i * 2 + 1; j < l; j = j * 2 + 1) {
            //左右节点中最大值的下标
            if (j + 1 < l && arr[j] < arr[j + 1]) {
                j++;
            }
            if (arr[j] > n) {
                arr[i] = arr[j];
                //记录被换最大值的下标
                i = j;
            } else {
                //没有交换就不用继续调整了
                break;
            }

        }
        arr[i] = n;
    }

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

桶排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

//桶排序
public class BucketSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        // 寻找数组的最大值与最小值
        int max = arr[0];
        int min = arr[0];
        for (int i = 1; i < l; i++) {
            if (min > arr[i]) {
                min = arr[i];
            }
            if (max < arr[i]) {
                max = arr[i];
            }
        }

        //桶的大小可以根据实际情况改变
        int bucketSize = 10;
        //桶的数量
        int bucketNum = (max - min) / bucketSize + 1;

        //创建桶
        List<List<Integer>> buckets = new ArrayList<>(bucketNum);
        for (int i = 0; i < bucketNum; i++) {
            buckets.add(new LinkedList<>());
        }

        //装桶
        for (int a : arr) {
            //桶编号
            int n = (a - min) / bucketSize;
            buckets.get(n).add(a);
        }

        //结合其他排序方法,分别对桶内数据进行排序
        for (int i = 0; i < bucketNum; i++) {
            Collections.sort(buckets.get(i));
        }

        //处理原数组
        int k = 0;
        for (int i = 0; i < bucketNum; i++) {
            for (Integer e : buckets.get(i)) {
                arr[k++] = e;
            }
        }

        return arr;
    }
}

基数排序

package com.sintor.xxx.sort.service.impl;

import com.sintor.xxx.sort.service.Sort;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 基数排序
 * 时间复杂度 O(n*k)
 * 空间复杂度 O(n+k)
 */
public class RadioSort implements Sort {
    @Override
    public int[] sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int l = arr.length;

        //计数最大位数
        int max = arr[0];
        for (int i = 1; i < l; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        int n = 1;
        while (max / 10 > 0) {
            n++;
            max /= 10;
        }

        //创建桶
        List<List<Integer>> buckets = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
            buckets.add(new LinkedList<>());
        }

        //排序
        for (int i = 0; i < n; i++) {
            for (int a : arr) {
                //桶编号
                int k = (a / (int) Math.pow(10, i)) % 10;
                buckets.get(k).add(a);
            }

            //处理原数组
            int c = 0;
            for (int z = 0; z < 10; z++) {
                for (Integer e : buckets.get(z)) {
                    arr[c++] = e;
                }
                buckets.get(z).clear();
            }
        }

        return arr;
    }
}

测试

package com.sintor.xxx.sort;

import com.sintor.xxx.sort.service.Sort;
import com.sintor.xxx.sort.service.impl.*;

import java.util.Arrays;

public class SortMain {

    private static final Sort bubbleSort = new BubbleSort();
    private static final Sort bucketSort = new BucketSort();
    private static final Sort countSort = new CountSort();
    private static final Sort heapSort = new HeapSort();
    private static final Sort insertSort = new InsertSort();
    private static final Sort mergeSort = new MergeSort();
    private static final Sort quickSort = new QuickSort();
    private static final Sort radioSort = new RadioSort();
    private static final Sort selectSort = new SelectSort();
    private static final Sort shellSort = new ShellSort();

    public static void main(String[] args) {
        int[] arr = {4, 6, 8, 5, 9, 4, 7, 9, 1, 2, 3, 7, 4, 33, 87, 2};
        System.out.println("冒泡排序:");
        System.out.println(Arrays.toString(bubbleSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("选择排序:");
        System.out.println(Arrays.toString(selectSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("桶排序:");
        System.out.println(Arrays.toString(bucketSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("计数排序:");
        System.out.println(Arrays.toString(countSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("堆排序:");
        System.out.println(Arrays.toString(heapSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("插入排序:");
        System.out.println(Arrays.toString(insertSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("归并排序:");
        System.out.println(Arrays.toString(mergeSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("快速排序:");
        System.out.println(Arrays.toString(quickSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("基数排序:");
        System.out.println(Arrays.toString(radioSort.sort(Arrays.copyOf(arr, arr.length))));
        System.out.println("希尔排序:");
        System.out.println(Arrays.toString(shellSort.sort(Arrays.copyOf(arr, arr.length))));
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值