十大排序算法实现(模板)

1、冒泡排序

    // 冒泡排序
    private void bubbleSort(int[] nums) {
        int n = nums.length;

        boolean flag = false;
        for(int i=0; i<n; i++) {
            if(flag) break;
            flag = true;
            for(int j=1; i+j<n; j++) {
                if(nums[j-1] > nums[j]) {
                    swap(nums, j-1, j);
                    flag = false;
                }
            }
        }
    }

2、选择排序

    // 选择排序
    private void selectionSort(int[] nums) {
        int n = nums.length;

        for(int i=0; i<n; i++) {
            int t = i;
            for(int j=i+1; j<n; j++) {
                if(nums[t] > nums[j]) {
                    t = j;
                }
            }
            swap(nums, i, t);
        }
    }

3、插入排序

    // 插入排序
    private void insertionSort(int[] nums) {
        int n = nums.length;

        for(int i=1; i<n; i++) {
            int j=i, t=nums[j];
            while(j-1 >= 0 && nums[j-1] > t) {
                nums[j] = nums[j-1];
                j -= 1;
            }
            nums[j] = t;
        }
    }

4、希尔排序

    // 希尔排序
    private void shellSort(int[] nums) {
        int n = nums.length;

        for(int i=n/2; i>0; i/=2) {
            for(int j=i; j<n; j++) {
                int t = nums[j];
                while(j-i >= 0 && nums[j-i] > t) {
                    nums[j] = nums[j-i];
                    j -= i;
                }
                nums[j] = t;
            }
        }
    }

5、归并排序

    // 归并排序
    private void mergeSort(int[] nums) {
        mergeSort(nums, 0, nums.length-1);
    }

    private void mergeSort(int[] nums, int l, int r) {
        if(l >= r) return;

        int mid = (l+r) >> 1;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid+1, r);

        merge(nums, l, mid, r);
    }

    private void merge(int[] nums, int l, int mid, int r) {
        int[] tmp = new int[r-l+1];

        int k=0, i=l, j=mid+1;
        while(i <= mid && j <= r) {
            if(nums[i] > nums[j]) tmp[k++] = nums[j++];
            else tmp[k++] = nums[i++];
        }
        while(i <= mid) {
            tmp[k++] = nums[i++];
        }
        while(j <= r) {
            tmp[k++] = nums[j++];
        }

        System.arraycopy(tmp, 0, nums, l, r + 1 - l);
    }

6、快速排序

    // 快速排序
    private void quickSort(int[] nums) {
        quickSort(nums, 0, nums.length-1);
    }

    private void quickSort(int[] nums, int l, int r) {
        if(l >= r) return;

        int t=nums[l], i=l, j=r;
        while(i < j) {
            while(i < j && nums[j] >= t) j--;
            nums[i] = nums[j];
            while(i < j && nums[i] <= t) i++;
            nums[j] = nums[i];
        }
        nums[i] = t;

        quickSort(nums, l, i-1);
        quickSort(nums, i+1, r);
    }

7、堆排序

    // 堆排序
    private void heapSort(int[] nums) {
        int n = nums.length;
        for(int i=n/2-1; i>=0; i--) {
            adjustHeap(nums, i, n);
        }

        for(int i=n-1; i>0; i--) {
            swap(nums, 0, i);
            adjustHeap(nums, 0, i);
        }
    }

    private void adjustHeap(int[] nums, int k, int n) {
        int t = nums[k];
        for(int i=2*k+1; i<n; i=2*i+1) {
            if(i+1 < n && nums[i+1] > nums[i]) i++;

            if(nums[i] > t) {
                nums[k] = nums[i];
                k = i;
            } else {
                break;
            }
        }
        nums[k] = t;
    }

8、计数排序

    // 计数排序
    private void countingSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        for (int num : nums) {
            maxValue = Math.max(maxValue, num);
        }
        int[] bucket = new int[maxValue+1];
        for(int num : nums) {
            bucket[num]++;
        }

        int t=0;
        for(int i=0; i<=maxValue; i++) {
            while(bucket[i] > 0) {
                nums[t++] = i;
                bucket[i]--;
            }
        }
    }

9、桶排序

    // 桶排序
    private void bucketSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        int minValue = Integer.MAX_VALUE;
        for(int num : nums) {
            maxValue = Math.max(maxValue, num);
            minValue = Math.min(minValue, num);
        }

        // 计算桶的数量
        int bucketNum = (maxValue - minValue) / n + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
        for(int i = 0; i < bucketNum; i++){
            bucketArr.add(new ArrayList<>());
        }

        // 将每个元素放入桶
        for (int value : nums) {
            int num = (value - minValue) / n;
            bucketArr.get(num).add(value);
        }

        // 对每个桶进行排序
        for (ArrayList<Integer> integers : bucketArr) {
            Collections.sort(integers);
        }

        // 将桶中的元素赋值到原序列
        int index = 0;
        for (ArrayList<Integer> integers : bucketArr) {
            for (Integer integer : integers) {
                nums[index++] = integer;
            }
        }
    }

10、基数排序

    // 基数排序
    private void radixSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        for(int num : nums) {
            maxValue = Math.max(maxValue, num);
        }
        int maxx = 0;
        while(maxValue > 0) {
            maxValue /= 10;
            maxx++;
        }

        int t = 1;
        for(int i=0; i<maxx; i++) {
            List<List<Integer>> list = new ArrayList<>();
            for(int j=0; j<10; j++) {
                list.add(new ArrayList<>());
            }

            for(int num : nums) {
                list.get((num/t)%10).add(num);
            }

            int tt=0;
            for(int j=0; j<10; j++) {
                for(int k=0; k<list.get(j).size(); k++) {
                    nums[tt++] = list.get(j).get(k);
                }
            }

            t *= 10;
        }
    }

汇总

import javassist.CodeConverter;
import jdk.nashorn.tools.Shell;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;

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

class Solution {
    // 冒泡排序
    private void bubbleSort(int[] nums) {
        int n = nums.length;

        boolean flag = false;
        for(int i=0; i<n; i++) {
            if(flag) break;
            flag = true;
            for(int j=1; i+j<n; j++) {
                if(nums[j-1] > nums[j]) {
                    swap(nums, j-1, j);
                    flag = false;
                }
            }
        }
    }

    // 选择排序
    private void selectionSort(int[] nums) {
        int n = nums.length;

        for(int i=0; i<n; i++) {
            int t = i;
            for(int j=i+1; j<n; j++) {
                if(nums[t] > nums[j]) {
                    t = j;
                }
            }
            swap(nums, i, t);
        }
    }

    // 插入排序
    private void insertionSort(int[] nums) {
        int n = nums.length;

        for(int i=1; i<n; i++) {
            int j=i, t=nums[j];
            while(j-1 >= 0 && nums[j-1] > t) {
                nums[j] = nums[j-1];
                j -= 1;
            }
            nums[j] = t;
        }
    }

    // 希尔排序
    private void shellSort(int[] nums) {
        int n = nums.length;

        for(int i=n/2; i>0; i/=2) {
            for(int j=i; j<n; j++) {
                int t = nums[j];
                while(j-i >= 0 && nums[j-i] > t) {
                    nums[j] = nums[j-i];
                    j -= i;
                }
                nums[j] = t;
            }
        }
    }

    // 归并排序
    private void mergeSort(int[] nums) {
        mergeSort(nums, 0, nums.length-1);
    }

    private void mergeSort(int[] nums, int l, int r) {
        if(l >= r) return;

        int mid = (l+r) >> 1;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid+1, r);

        merge(nums, l, mid, r);
    }

    private void merge(int[] nums, int l, int mid, int r) {
        int[] tmp = new int[r-l+1];

        int k=0, i=l, j=mid+1;
        while(i <= mid && j <= r) {
            if(nums[i] > nums[j]) tmp[k++] = nums[j++];
            else tmp[k++] = nums[i++];
        }
        while(i <= mid) {
            tmp[k++] = nums[i++];
        }
        while(j <= r) {
            tmp[k++] = nums[j++];
        }

        System.arraycopy(tmp, 0, nums, l, r + 1 - l);
    }

    // 快速排序
    private void quickSort(int[] nums) {
        quickSort(nums, 0, nums.length-1);
    }

    private void quickSort(int[] nums, int l, int r) {
        if(l >= r) return;

        int t=nums[l], i=l, j=r;
        while(i < j) {
            while(i < j && nums[j] >= t) j--;
            nums[i] = nums[j];
            while(i < j && nums[i] <= t) i++;
            nums[j] = nums[i];
        }
        nums[i] = t;

        quickSort(nums, l, i-1);
        quickSort(nums, i+1, r);
    }

    // 堆排序
    private void heapSort(int[] nums) {
        int n = nums.length;
        for(int i=n/2-1; i>=0; i--) {
            adjustHeap(nums, i, n);
        }

        for(int i=n-1; i>0; i--) {
            swap(nums, 0, i);
            adjustHeap(nums, 0, i);
        }
    }

    private void adjustHeap(int[] nums, int k, int n) {
        int t = nums[k];
        for(int i=2*k+1; i<n; i=2*i+1) {
            if(i+1 < n && nums[i+1] > nums[i]) i++;

            if(nums[i] > t) {
                nums[k] = nums[i];
                k = i;
            } else {
                break;
            }
        }
        nums[k] = t;
    }

    // 计数排序
    private void countingSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        for (int num : nums) {
            maxValue = Math.max(maxValue, num);
        }
        int[] bucket = new int[maxValue+1];
        for(int num : nums) {
            bucket[num]++;
        }

        int t=0;
        for(int i=0; i<=maxValue; i++) {
            while(bucket[i] > 0) {
                nums[t++] = i;
                bucket[i]--;
            }
        }
    }

    // 桶排序
    private void bucketSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        int minValue = Integer.MAX_VALUE;
        for(int num : nums) {
            maxValue = Math.max(maxValue, num);
            minValue = Math.min(minValue, num);
        }

        // 计算桶的数量
        int bucketNum = (maxValue - minValue) / n + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
        for(int i = 0; i < bucketNum; i++){
            bucketArr.add(new ArrayList<>());
        }

        // 将每个元素放入桶
        for (int value : nums) {
            int num = (value - minValue) / n;
            bucketArr.get(num).add(value);
        }

        // 对每个桶进行排序
        for (ArrayList<Integer> integers : bucketArr) {
            Collections.sort(integers);
        }

        // 将桶中的元素赋值到原序列
        int index = 0;
        for (ArrayList<Integer> integers : bucketArr) {
            for (Integer integer : integers) {
                nums[index++] = integer;
            }
        }
    }

    // 基数排序
    private void radixSort(int[] nums) {
        int n = nums.length;

        int maxValue = Integer.MIN_VALUE;
        for(int num : nums) {
            maxValue = Math.max(maxValue, num);
        }
        int maxx = 0;
        while(maxValue > 0) {
            maxValue /= 10;
            maxx++;
        }

        int t = 1;
        for(int i=0; i<maxx; i++) {
            List<List<Integer>> list = new ArrayList<>();
            for(int j=0; j<10; j++) {
                list.add(new ArrayList<>());
            }

            for(int num : nums) {
                list.get((num/t)%10).add(num);
            }

            int tt=0;
            for(int j=0; j<10; j++) {
                for(int k=0; k<list.get(j).size(); k++) {
                    nums[tt++] = list.get(j).get(k);
                }
            }

            t *= 10;
        }
    }

    public static void main(String[] args) {
        Solution test = new Solution();

        int[] nums1 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.bubbleSort(nums1);
        System.out.println("冒泡排序: " + Arrays.toString(nums1));

        int[] nums2 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.selectionSort(nums2);
        System.out.println("选择排序: " + Arrays.toString(nums2));

        int[] nums3 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.insertionSort(nums3);
        System.out.println("插入排序: " + Arrays.toString(nums3));

        int[] nums4 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.shellSort(nums4);
        System.out.println("希尔排序: " + Arrays.toString(nums4));

        int[] nums5 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.mergeSort(nums5);
        System.out.println("归并排序: " + Arrays.toString(nums5));

        int[] nums6 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.quickSort(nums6);
        System.out.println("快速排序: " + Arrays.toString(nums6));

        int[] nums7 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.heapSort(nums7);
        System.out.println("堆排序: " + Arrays.toString(nums7));

        int[] nums8 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.countingSort(nums8);
        System.out.println("计数排序: " + Arrays.toString(nums8));

        int[] nums9 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.bucketSort(nums9);
        System.out.println("桶排序: " + Arrays.toString(nums9));

        int[] nums10 = {9, 1, 2, 5, 8, 7, 6, 3, 4, 0};
        test.radixSort(nums10);
        System.out.println("基数排序: " + Arrays.toString(nums10));

    }

    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

输出:

能力有限,如有误,欢迎指正。。。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值