java记录 - 基数排序

基数排序

import java.text.SimpleDateFormat; 
import java.util.Arrays;
import java.util.Date;

public class RadixSort {

	public static void main(String[] args) {

		int[] arr = new int[8000000];
		for (int i = 0; i < 8000000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}
		System.out.println("排序前"); 
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是=" + date1Str);


		radixSort(arr);//八百万数据1秒搞定

		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2); 
		System.out.println("排序前的时间是=" + date2Str);

	}

	//基数排序方法
	public static void radixSort(int[] arr) {

		int max = arr[0]; //假设第一数就是最大数
		for(int i = 1; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}

		//得到最大数是几位数
		int maxLength = (max + "").length();

		int[][] bucket = new int[10][arr.length];

		int[] bucketElementCounts = new int[10];

		for(int i = 0 , n = 1; i < maxLength; i++, n *= 10) { 
			for(int j = 0; j < arr.length; j++) {
				//取出每个元素的对应位的值
				int digitOfElement = arr[j] / n % 10;
				//放入到对应的桶中
				
				bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j]; 

				bucketElementCounts[digitOfElement]++;

			}
			int index = 0;
			for(int k = 0; k < bucketElementCounts.length; k++) {
				if(bucketElementCounts[k] != 0) {
					for(int l = 0; l < bucketElementCounts[k]; l++) {
						//取出元素放入到 arr 
						arr[index++] = bucket[k][l];
					}
				}
				bucketElementCounts[k] = 0;

			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/bell_love/article/details/106319787