Java中8种常见的排序方法(7)

  在基数排序中,没有任何元素的比较和交换,元素只是在每一轮中从一个队列移动到另一个队列。对于给定的基数,遍历数据的轮次是一个常数,它与排序关键字的数目无关,于是,基数排序算法的时间复杂度为O(n)

1.基数排序算法要根据给定问题特别设计;
2.如果排序关键字中的数字数目与列表中元素的数目接近,那么算法的时间复杂度接近O(n平方);
3.基数影响空间复杂度。

8.3.java实现

package MySort;

import java.util.Arrays;

public class MySortTest9 {

public static void main(String[] args) {

int[] data = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };

// 5.分配排序(基数排序)
        System.out.println("基数排序:\t" + Arrays.toString(radixSort(data, getMaxWeishu(data))));
    }

// 求得最大位数d
    public static int getMaxWeishu(int[] a) {
        int max = a[0];
        for (int i = 0; i < a.length; i++) {
            if (a[i] > max)
                max = a[i];
        }
        int tmp = 1, d = 1;
        while (true) {
            tmp *= 10;
            if (max / tmp != 0) {
                d++;
            } else
                break;
        }
        return d;
    }

// pos=1表示个位,pos=2表示十位
    public static int getNumInPos(int num, int pos) {
        int tmp = 1;
        for (int i = 0; i < pos - 1; i++) {
            tmp *= 10;
        }
        return (num / tmp) % 10;
    }

private static int[] radixSort(int[] data, int d) {
        int[][] array = new int[10][data.length + 1];
        for (int i = 0; i < 10; i++) {
            array[i][0] = 0;
            // array[i][0]记录第i行数据的个数
        }
        for (int pos = 1; pos <= d; pos++) {
            for (int i = 0; i < data.length; i++) {
                // 分配过程
                int row = getNumInPos(data[i], pos);
                int col = ++array[row][0];
                array[row][col] = data[i];
            }
            for (int row = 0, i = 0; row < 10; row++) {
                // 收集过程
                for (int col = 1; col <= array[row][0]; col++) {
                    data[i++] = array[row][col];
                }
                array[row][0] = 0;
                // 复位,下一个pos时还需使用
            }
        }
        return data;
    }

}

上述文字均来自网络的整理,接下来我会慢慢整理,根据个人理解优化文字部分;
以下为上述代码的合集

package MySort;

import java.util.Arrays;

/*
上述文字均来自网络的整理,接下来我会慢慢整理,根据个人理解优化文字部分;
以下为上述代码的合集
*/
public class MySortTest {

public static void main(String[] args) {
        // 原始数据
        int[] data1 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data2 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data3 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data4 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data5 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data6 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data7 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        int[] data8 = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
        // 1.插入排序:直接插入排序
        System.out.println("插入排序:\t" + Arrays.toString(insertSort(data1)));
        // 1.插入排序:希尔排序
        System.out.println("希尔排序:\t" + Arrays.toString(shellSort(data2)));
        // 2.交换排序:冒泡排序
        System.out.println("冒泡排序:\t" + Arrays.toString(bubbleSort(data3)));
        // 2.交换排序:快速排序
        System.out.println("快速排序:\t" + Arrays.toString(quickSort(data4, 0, data4.length - 1)));
        // 3.选择排序:直接选择排序
        System.out.println("直接排序:\t" + Arrays.toString(chooseSort(data5)));
        // 3.选择排序:堆排序
        System.out.println("堆排序:\t" + Arrays.toString(heapSort(data6)));
        // 4.归并排序
        mergeSort(data7, 0, data7.length - 1);
        System.out.println("归并排序:\t" + Arrays.toString(data7));
        // 5.分配排序(基数排序)
        System.out.println("基数排序:\t" + Arrays.toString(radixSort(data8, getMaxWeishu(data8))));
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e3c7ef191ec5f9cba3335d3d026fea11.html