• 十大排序算法


    十大排序算法

    十大排序算法 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。


    sort-algorithm

    字典:

    • n:数据规模
    • k:桶的大小(整数范围)
    • 稳定性:排序后两个相等元素的顺序和排序之前是否相同
    // 交换元素
    public static void swap(int[] ints, int m, int n) {
        int temp = ints[m];
        ints[m] = ints[n];
        ints[n] = temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1、冒泡排序

    // 冒泡排序
    public static int[] bubbleSort(int[] ints) {
        for (int i = 0; i < ints.length - 1; i++) {
            for (int j = 0; j < ints.length - 1 - i; j++) {
                if (ints[j] > ints[j + 1]) {
                    swap(ints, j, j + 1);
                }
            }
        }
        return ints;
    }
    
    // 鸡尾酒排序(冒泡的升级版)
    public static int[] cocktailSort(int[] ints) {
        for (int i = 0; i < ints.length / 2; i++) {
    
            for (int j = i; j < ints.length - 1 - i; j++) {
                if (ints[j] > ints[j + 1]) {
                    swap(ints, j, j + 1);
                }
            }
    
            for (int j = ints.length - 1 - (i + 1); j > i; j--) {
                if (ints[j] < ints[j - 1]) {
                    swap(ints, j, j - 1);
                }
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2、选择排序

    // 选择排序
    public static int[] selectionSort(int[] ints) {
        for (int i = 0; i < ints.length - 1; i++) {
    
            int minIndex = i;
    
            for (int j = i; j < ints.length - 1; j++) {
                if (ints[j + 1] < ints[minIndex]) {
                    minIndex = j + 1;
                }
            }
    
            if (minIndex != i) {
                swap(ints, i, minIndex);
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、插入排序

    // 插入排序
    public static int[] insertionSort(int[] ints) {
        for (int i = 1; i < ints.length; i++) {
            for (int j = i; j > 0; j--) {
                if (ints[j] < ints[j - 1]) {
                    swap(ints, j - 1, j);
                }
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、希尔排序

    // 希尔排序(插入的升级版)
    public static int[] shellSort(int[] ints) {
        for (int step = ints.length / 2; step > 0; step /= 2) {
            for (int i = step; i < ints.length; i++) {
                for (int j = i; j >= step; j -= step) {
                    if (ints[j] < ints[j - step]) {
                        swap(ints, j -step, j);
                    }
                }
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5、归并排序

    // 归并排序
    public static int[] mergeSort(int[] ints, int startIndex, int endIndex) {
        if (startIndex == endIndex) {
            return new int[] { ints[startIndex] };
        }
    
        int midIndex = startIndex + (endIndex - startIndex) / 2;
        int[] left = mergeSort(ints, startIndex, midIndex);
        int[] right = mergeSort(ints, midIndex + 1, endIndex);
    
        int[] temp = new int[left.length + right.length];
    
        int m = 0, n = 0, index = 0;
        while (m < left.length && n < right.length) {
            temp[index++] = left[m] < right[n] ? left[m++] : right[n++];
        }
    
        while (m < left.length) {
            temp[index++] = left[m++];
        }
    
        while (n < right.length) {
            temp[index++] = right[n++];
        }
        return temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    6、快速排序

    // 快速排序
    public static void quickSort(int[] ints, int startIndex, int endIndex) {
        if (startIndex > endIndex) {
            return;
        }
    
        int key = ints[startIndex];
        int i = startIndex, j = endIndex;
    
        while (i < j) {
            while (i < j && ints[j] > key) {
                j--;
            }
    
            while (i < j && ints[i] < key) {
                i++;
            }
    
            if (i < j) {
                swap(ints, i, j);
            }
        }
    
        ints[startIndex] = ints[i];
        ints[i] = key;
    
        quickSort(ints, startIndex, i - 1);
        quickSort(ints, i + 1, endIndex);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    7、堆排序

    // 堆排序
    public static int[] heapSort(int[] ints) {
        for (int i = ints.length / 2 - 1; i >= 0; i--) {
            adjustHeap(ints, i, ints.length);
        }
    
        for (int i = ints.length - 1; i > 0; i--) {
            swap(ints, 0, i);
            adjustHeap(ints, 0, i);
        }
        return ints;
    }
    
    public static void adjustHeap(int[] ints, int index, int length) {
        int maxIndex = index;
        int leftIndex = 2 * index + 1;
        int rightIndex = 2 * index + 2;
    
        if (leftIndex < length && ints[leftIndex] > ints[maxIndex]) {
            maxIndex = leftIndex;
        }
    
        if (rightIndex < length && ints[rightIndex] > ints[maxIndex]) {
            maxIndex = rightIndex;
        }
    
        if (maxIndex != index) {
            swap(ints, index, maxIndex);
            adjustHeap(ints, maxIndex, length);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    8、计数排序

    // 计数排序
    public static int[] countingSort(int[] ints) {
        int max = ints[0], min = ints[0];
        for (int item : ints) {
            max = Math.max(max, item);
            min = Math.min(min, item);
        }
    
        int k = max - min + 1;
        int[] temp = new int[k];
        for (int item : ints) {
            temp[item - min]++;
        }
    
        int index = 0;
        for (int i = 0; i < temp.length; i++) {
            while (temp[i] > 0) {
                ints[index++] = i + min;
                temp[i]--;
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    9、桶排序

    // 桶排序
    public static int[] bucketSort(int[] ints, int capacity) {
        int max = ints[0], min = ints[0];
        for (int item : ints) {
            max = Math.max(max, item);
            min = Math.min(min, item);
        }
    
        int k = (max - min) / capacity + 1;
        int[][] temp = new int[k][0];
        for (int item : ints) {
            int bucketIndex = (item - min) / capacity;
            int[] bucket = Arrays.copyOf(temp[bucketIndex], temp[bucketIndex].length + 1);
            bucket[bucket.length - 1] = item;
            temp[bucketIndex] = bucket;
        }
    
        int index = 0;
        for (int[] bucket : temp) {
            if (bucket.length == 0) {
                continue;
            }
    
            bubbleSort(bucket);
    
            for (int item : bucket) {
                ints[index++] = item;
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    10、基数排序

    // 基数排序
    public static int[] radixSort(int[] ints) {
        int maxAbs = Math.abs(ints[0]);
        for (int item : ints) {
            int abs = Math.abs(item);
            maxAbs = Math.max(maxAbs, abs);
        }
    
        int maxDigit = 0;
        while (maxAbs != 0) {
            maxAbs /= 10;
            maxDigit++;
        }
    
        for (int i = 0, m = 10, n = 1; i < maxDigit; i++, m *= 10, n *= 10) {
    
            int[][] temp = new int[10 * 2][0];
    
            for (int item : ints) {
                int bucketIndex = (item % m) / n + 10;
                int[] bucket = Arrays.copyOf(temp[bucketIndex], temp[bucketIndex].length + 1);
                bucket[bucket.length - 1] = item;
                temp[bucketIndex] = bucket;
            }
    
            int index = 0;
            for (int[] bucket : temp) {
                if (bucket.length == 0) {
                    continue;
                }
    
                for (int item : bucket) {
                    ints[index++] = item;
                }
            }
        }
        return ints;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    @XGLLHZ - 陈慧娴 《夜机》.mp3

  • 相关阅读:
    03-JAVA设计模式-观察者模式
    自动控制原理7.4---离散系统的数学模型
    1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码
    安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍
    yolo v5 坐标相关的判断与转换,评价指标,训练结果解析
    php基于PHP的汉服文化交流平台毕业设计源码240903
    自动驾驶——仿真的几大挑战
    神经网络图像细节分析,神经网络 图像相似度
    基于C语言实现的自动打乱九宫格并且还原
    Android Jetpack Navigation基本使用
  • 原文地址:https://blog.csdn.net/XGLLHZ/article/details/134532370