桶排序(BucketSort)(java)


一、原理

    桶排序的工作原理是吧區間划分為n個大小相同的子區間,這樣的區間稱為桶。然后將n個輸入的數分步到各個桶中去。每個桶再個別的排序,然后按照次序吧各個桶

中的元素列出來即可。

二、時間復雜度

    桶排序是一種鴿巢排序的一種歸納結果。當要被排序陣列內的數值是均勻分配的時候,桶排序使用線性時間(O(n))。但桶排序並不是比較排序,它不受

O(nlongn)下限的影響。

    eg:對大小為[1...1000]范圍內的n個整數A[1..n]排序。可以把桶設置為大小為10的范圍,具體而言設集合B[1]存儲[1..10]的整數,集合B[2]存儲(10..20]的整數,

i=1,2,,100.總共100個桶然后掃描A[i],吧每個A[i]放入到對應的B[j]中。然后再對每個桶里的數字排序。

    假設有n個數字,有m個桶,如果數字是平均分布的,則每個桶里面平均有n/m個數字。如果每個桶里中的數字采用快速排序,那么整個算法的復雜度是

O(n+m*n/m*log(n/m)) = O(n+nlogn-nlogm).當m接近n時,桶排序復雜度接近O(n)。

 

 


三、代碼
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.List;

public class BucketSort {    

    int bucketSize = 10    

    int arraySize = 1000;

    public static void main(String[] args) {
      // TODO Auto-generated method stub
      BucketSort bs = new BucketSort();
      int[] array = bs.getArray();
      bs.bucketSort(array);
    }

    public int[] getArray(){
      int[] arr = new int[arraySize /3];
      Random r = new Random();
      for(int i = 0; i < arraySize /3 ; i++)
      {
        arr[i] = r.nextInt(100000);
      }
      return arr;

    }

    public void bucketSort(int[] a)
    {
      List<Integer> bucket[] = new ArrayList[bucketSize];

      for(int i=0; i < a.length ; i++)
      {
        int temp = a[i]/10000;
        if(bucket[temp] == null)
        {
          bucket[temp] = new
          ArrayList<Integer>();
        }
        bucket[temp].add(a[i]);
      }

      //對桶內各個元素進行排序
      for(int j=0;j<bucketSize;j++)
      {
        intsertSort(bucket[j]);
        printList(bucket[j]);
      }
    }

    private void printList(List<Integer> list) {
      // TODO Auto-generated method stub
      while(list.size()>0)
      {
        System.out.print(list.remove(0) +"\t");
      }
    }

    private void intsertSort(List<Integer> list) {
      // TODO Auto-generated method stub
      Collections.sort(list);
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM