二十、自己動手實現排序算法(8)-------- “ Counting Sort 計數排序 ”

參考文章:

https://www.cnblogs.com/freedom314/p/5847092.html               計數排序詳解(強推

https://www.cnblogs.com/guoyaohua/p/8600214.html                 十大經典排序算法最強總結(含JAVA代碼實現)


計數排序分析:

平均時間複雜度 最好情況 最壞情況 空間複雜度 排序方式 穩定性
O(n+k) O(n+k) O(n+k) O(k) Out-place 穩定

溫馨提示:

       上面的這篇博客,確實對 計數排序 的原理做了很好的解釋,如果理解了原理之後,其實很快的就可以用 Java 寫出 計數排序的例子。若干看不懂代碼,記得拿出紙和筆,按照程序走一遍,走一遍,再走一遍!!!

 

計數排序原理:

       計數排序的核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。 作爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。

       計數排序(Counting sort)是一種穩定的排序算法。計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。

 

計算排序算法描述:

  • 找出待排序的數組中最大和最小的元素;
  • 統計數組中每個值爲i的元素出現的次數,存入數組C的第i項;
  • 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
  • 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。

 

計數排序算法圖解原理:

 

 

Java 代碼實現計數排序算法:

代碼一


package com.sorting.algorithm;

public class CountingSort {
	
	public static int[] countSort(int[] array){
		// 1, 計數排序  如數組  { 7 4 2 1 5 3 1 5 },比7小的元素有7個,7就應該排在第八位,同理,1在第一位或者第二位
		int[] arrA = array;
		
		int max = arrA[0];
		for (int i = 0; i < arrA.length; i++) {
			if(arrA[i] > max)
				max = arrA[i];
		}
		
		int[] arrB = new int[max+1];
		int[] arrC = new int[arrA.length];
		
		// 2,統計數組中元素出現的個數,按照大小進行排序,
		for (int i = 0; i < arrA.length; i++) {
			arrB[arrA[i]]++;
		}
		
		for (int i = 1; i < arrB.length; i++) {
			arrB[i] = arrB[i] + arrB[i-1];
		}
		
		// 3, 根據元素在數組中出現的個數,對元素進行排序,
		for (int i = 0; i < arrC.length; i++) {
			arrB[arrA[i]]--;
			arrC[arrB[arrA[i]]] = arrA[i];
		}
		
		return arrC;
	}
	
	public static void printArr(int[] array){
		for (int i = 0; i < array.length; i++) {
			if(i != array.length)
				System.out.print(array[i]+ ", ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		
		int[] array = {7,4,2,1,5,3,1,5};
		
		System.out.println("排序之前:");
		
		printArr(array);
		int[] sortedArr = countSort(array);

		System.out.println("排序之後:");
		printArr(sortedArr);
	}
}

 

代碼二:


package com.sorting.algorithm;

import java.util.Arrays;

public class CountingSort2 {
	
	public static int[] countSort(int[] array){
		int bias,max=array[0],min=array[0];
		for (int i = 0; i < array.length; i++) {
			if(max < array[i])
				max = array[i];
			if(min > array[i])
				min = array[i];
		}
		
		// 數組中最小元素到0 的偏離程度
		bias = 0-min;
		
		// 輔助數組的大小設爲 max-min+1 , 
		int[] bucket = new int[max-min+1];
		// 將 bucket 每個數組元素設置爲0
		Arrays.fill(bucket, 0);
		// 統計原數組中每個元素出現的次數
		for (int i = 0; i < array.length; i++) {
			bucket[array[i]+bias]++;
		}
		
		// 設置兩個參數 index 和 i,分別指向 array 和 bucket 的下標,依次往後走,
		int index=0 , i=0;
		while(index < array.length){
			if(bucket[i]!=0){
				array[index] = i-bias;
				bucket[i]--;
				index++;
			}else {
				i++;
			}
		}
		
		return array;
	}
	
	public static void printArr(int[] array){
		for (int i = 0; i < array.length; i++) {
			if(i != array.length)
				System.out.print(array[i]+ ", ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		
		int[] array = {7,4,2,1,5,3,1,5};
		
		System.out.println("排序之前:");
		
		printArr(array);
		int[] sortedArr = countSort(array);

		System.out.println("排序之後:");
		printArr(sortedArr);
	}
}

 

 

計數排序代碼測試:

代碼一:

 

代碼二:

 

 

上面的代碼都經過我的測試,大家如果有疑問,也可以留言。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章