package com.wentora.exercise; /** * 桶排序 * 思想:将一组在[0,1)范围内的实数进行排序,方法是将它们乘以该数组的长度并取整后放入另一链表数组 * 再分别对每一个链表数组进行排序,然后按次序输出即可 * @author wentora */ import java.util.ArrayList; import java.util.Collections; import java.util.Random; import java.util.Scanner; public class BucketSort { private float[] a; @SuppressWarnings("unchecked") private ArrayList[] b; BucketSort(float[] a) { this.a = a; b = new ArrayList[a.length]; for(int i = 0; i < a.length; i++) b[i] = new ArrayList<Float>(); } @SuppressWarnings("unchecked") void bucketSort() { for(int i = 0; i < a.length; i++) { int num = (int)(a[i] * a.length); b[num].add(a[i]); } for(int i = 0; i < a.length; i++) { Collections.sort(b[i]); } for(int i = 0; i < a.length; i++) { int k = 0; while(k < b[i].size()) { System.out.printf("%3.2f" + " ",b[i].get(k)); k++; } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); int length; System.out.print("please input length : "); length = scan.nextInt(); float[] a = new float[length]; Random rand = new Random(); for(int i = 0; i < length; i++) a[i] = rand.nextFloat(); BucketSort bs = new BucketSort(a); System.out.print("array a is : "); for(int i = 0; i < a.length; i++) System.out.printf("%3.2f ", a[i]); System.out.println(); System.out.print("after bucketSort : " ); bs.bucketSort(); } }