基数排序

 2022-07-19    0 条评论    9631 浏览

排序

优点

原理简单、效率高、效果稳定,空间换时间。

原理

  • 确定待排数组中最大元素多少位,以此为基数。
  • 将数组以基数为循环,分别获取每个数组的个位、十位、百位等。
  • 循环内的操作:以个位排序,使得数组以个位整体有序。下次循环则以十位排序,使得数组以十位整体有序。以此类推,直到循环完毕。
  • 时间复杂度:O(n)
  • 稳定性:不稳定的
  • 一千万个随机数排序:平均650ms

code

/**
	 * 全部以数组和值计算,速度快
	 * @param number
	 */
	public static void sort(int[] number) //d表示最大的数有多少位
    {
		// 首先确定排序的趟数;
		int max = number[0];
		for (int i = 1; i < number.length; i++) {// 找出最大值
			if (number[i] > max) {
				max = number[i];
			}
		}
		int d = 0;
		// 判断位数;
		while (max > 0) {// 判断最大值有多少位
			max /= 10;
			d++;
		}
        int k = 0;//整个数组的角标计数器
        int n = 1;//用来计算每个元素的位的值
        //数组的第一维表示可能的余数0-9,二维用来承接数组值
        int[][]temp = new int[10][number.length];
        //order数组用来表示0~9位中的数组元素的个数,是计数器。order[i]用来表示该位是i的数的个数
        int[]order = new int[10];
        for(int m = 1 ; m <= d; m++)
        {
            for(int i = 0; i < number.length; i++)
            {
            	//获取第m位的值
                int lsd = ((number[i] / n) % 10);
                //将第i个元素根据第m位的值lsd,放到二位数组temp的第lsd列中的第order[lsd]位。
                temp[lsd][order[lsd]] = number[i];
                //order数组计数器将对应值加一。
                order[lsd]++;
            }
            //从0列遍历二维数组
            for(int i = 0; i < 10; i++)
            {
            	//第二维中的每个元素都要顺序遍历,order[i]表示二维数组中的第一维度中第i位下的数组有多少位
                if(order[i] != 0)
                    for(int j = 0; j < order[i]; j++)
                    {
                        number[k] = temp[i][j];
                        k++;
                    }
                order[i] = 0;
            }
            n *= 10;
            k = 0;
        }
    }