基数排序及十大排序总结
基数排序
-
基数排序就是先对最后一位进行分类排序,然后再对倒数第二位进行排序,然后倒数第三位,直到最后一位,每次对每一位进行排序时,都会不断变得有序
-
由于每位数大小位0-9,所以我们需要10个桶来排序
-
如何求个/十/百位上得数是多少呢?
int radix = (int) (a[j] / Math.pow(10, i)) % 10;:因为要求个位就是对整个数取余数10,如果是十位的话先将整个数除以10再取余,如果百位的话就除以100,因此我们可以利用Math的pow函数,来决定每次到底是除以多少 -
时间复杂度位O(kn)、空间复杂度为O(n + k),是稳定排序,且非原地排序
-
代码实现
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; /** * @Description: 基数排序 * @Author: LinZeLiang * @Date: 2020-10-11 */ public class RadixSort { public static void main(String[] args) { int[] a = {9, 54, 3, 6, 43, 11, 27, 98, 43, 5, 2, 89, 1, 4, 8, 16, 20}; radixSort(a); System.out.println(Arrays.toString(a)); } private static void radixSort(int[] a) { //获取最大值 int max =a[0]; for (int i = 1; i < a.length; i++) { if (max < a[i]) { max = a[i]; } } //获取最大的数的位数 int num = 0; while (max != 0) { max /= 10; num++; } //创建10个桶 int bucketNum = 10; ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>(bucketNum); //初始化桶 for (int i = 0; i < bucketNum; i++) { bucketList.add(new LinkedList<Integer>()); } //进行桶的每一趟排序 for (int i = 0; i < num; i++) { for (int j = 0; j < a.length; j++) { //获取最后一位数 //如果是第二趟循环,就除以10然后再取余,这样子就可以实时获取固定位的数,而不改变原数组 int radix = (int) (a[j] / Math.pow(10, i)) % 10; //放进对应的桶里 bucketList.get(radix).add(a[j]); } //合并原数组 int k = 0; for (LinkedList<Integer> integers : bucketList) { for (Integer integer : integers) { a[k++] = integer; } //取出来之后将这个桶清空,供下一次循环使用 integers.clear(); } } } }
十大排序总结
我们来看看十大排序他们的算法性质:
我走得很慢,但我从不后退!

浙公网安备 33010602011771号