1. 程式人生 > >計數排序(Countsort)之Java實現

計數排序(Countsort)之Java實現

計數排序演算法介紹

比較排序演算法可以通過決策樹模型證明,其下線是O(nlgn)。而本文介紹的是時間效率為O(n)的計數排序所謂排序演算法,無非就是把正確的元素放到正確的位置,計數排序就是計算相同key的元素各有多少個,然後根據出現的次數累加而獲得最終的位置資訊。但是計數排序有兩個限制條件,那就是存在一個正整數K,使得數組裡面的所有元素的key值都不大於N,且key值都是非負整數。

計數排序演算法Java實現

計數排序演算法步驟大概有三個步驟:

  1. 建一個長度為K+1的的陣列C,裡面的每一個元素初始都置為0(Java裡面預設就是0)。
  2. 遍歷待排序的陣列,計算其中的每一個元素出現的次數,比如一個key為i的元素出現了3次,那麼C[i]=3。
  3. 累加C陣列,獲得元素的排位,從0開始遍歷C, C[i+1]=C[i]+C[i-1]
  4. 建一個臨時陣列T,長度與待排序陣列一樣。從陣列末尾遍歷待排序陣列,把元素都安排到T裡面,直接從C裡面就可以得到元素的具體位置, 不過記得每處理過一個元素之後都要把C裡面對應位置的計數減1。

具體的排序以及測試程式碼如下:

public class CountSort {

		public static void main(String[] args) throws Exception {
			int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 6, 1, 0 };

			System.out.println("Before sort:");
			ArrayUtils.printArray(array);

			countSort(array, 9);

			System.out.println("After sort:");
			ArrayUtils.printArray(array);
		}

		public static void countSort(int[] array, int range) throws Exception {
			if (range <= 0) {
				throw new Exception("range can't be negative or zero.");
			}

			if (array.length <= 1) {
				return;
			}

			int[] countArray = new int[range + 1];
			for (int i = 0; i < array.length; i++) {
				int value = array[i];
				if (value < 0 || value > range) {
					throw new Exception("array element overflow range.");
				}
				countArray[value] += 1;
			}

			for (int i = 1; i < countArray.length; i++) {
				countArray[i] += countArray[i - 1];
			}

			int[] temp = new int[array.length];
			for (int i = array.length - 1; i >= 0; i--) {
				int value = array[i];
				int position = countArray[value] - 1;

				temp[position] = value;
				countArray[value] -= 1;
			}

			for (int i = 0; i < array.length; i++) {
				array[i] = temp[i];
			}
		}
	}


相關推薦

計數排序(Countsort)Java實現

計數排序演算法介紹 比較排序演算法可以通過決策樹模型證明,其下線是O(nlgn)。而本文介紹的是時間效率為O(n)的計數排序。所謂排序演算法,無非就是把正確的元素放到正確的位置,計數排序就是計算相同key的元素各有多少個,然後根據出現的次數累加而獲得最終的位置資訊。但是計數

歸併排序(Mergesort)Java實現

歸併排序演算法介紹 歸併排序是一個分治演算法(Divide and Conquer)的一個典型例項,把一個數組分為兩個大小相近(最多差一個)的子陣列,分別把子陣列都排好序之後通過歸併(Merge)手法合成一個大的排好序的陣列,歸併的過程依然用撲克來解釋,想象一下桌子上有兩堆

拓撲排序(Topologicalsort)Java實現

拓撲排序演算法介紹 拓撲排序解決的是一系列相互依賴的事件的排序問題,比如Ant中有很多的Task,而某些Task依賴於另外的Task,編譯之前需要清理空間,打包之前要先編譯,但其它一些Task處理順序可以調換(是無所謂前後,不是並行), 如何安排Task的執行順序就可以用拓

快速排序(Quicktsort)Java實現

快速排序演算法介紹 快速排序和歸併排序都使用分治法來設計演算法,區別在於歸併排序把陣列分為兩個基本等長的子陣列,分別排好序之後還要進行歸併(Merge)操作,而快速排序拆分子陣列的時候顯得更有藝術,取一個基準元素,拆分之後基準元素左邊的元素都比基準元素小,右邊的元素都不小於

插入排序(Insertsort)Java實現

插入排序演算法介紹 排序演算法是最簡單的演算法,也是最基本的演算法。顧名思義,插入排序就是把當前待排序的元素插入到一個已經排好序的列表裡面。 一個非常形象的例子就是右手抓取一張撲克牌,並把它插入左手拿著的排好序的撲克裡面。插入排序的最壞執行時間是O(n2), 所以並不是最優

排序(Heapsort)Java實現

堆排序演算法介紹 堆是一種重要的資料結構,為一棵完全二叉樹, 底層如果用陣列儲存資料的話,假設某個元素為序號為i(Java陣列從0開始,i為0到n-1),如果它有左子樹,那麼左子樹的位置是2i+1,如果有右子樹,右子樹的位置是2i+2,如果有父節點,父節點的位置是(n-1)

快速排序java實現

star sta arrays -- 發現 作者 沒有 span array 據說一般的筆試或面試都會考考排序,今天就試著想自己實現一把,看了原理後,發現沒那麽容易,又去網上找了下,發現評論都說作者的代碼有問題。這更激起了我的興趣。 遂堅持編寫出來並進行了測試,應該沒有問題

排序演算法插入排序演算法【java實現

插入排序演算法通過對未排序的資料執行逐個插入至合適的位置而完成排序工作。思路簡單,應用較多。但是此演算法在資料無規律的情況下,需要移動大量的資料,效率不高。 步驟: (1)首先對陣列的前兩個資料進行從小到大排序。 (2)接著將第3個數據與排好序的兩個資料進行比較,將第3個數據插入合適的位

排序演算法選擇排序演算法【java實現

簡介:遍歷陣列,每次選出最小的數與索引第一個進行交換,直到全部完成。 package zhgyu.sort; /** /*選擇排序演算法 * @author zhgyu * */ public class SelectionSort { static final int SIZE =

希爾排序Java實現

希爾排序思想: 希爾排序其實就是將一個數組分段進行插入排序,最後再將分段序列組合在一起進行大的插入排序。 也即:希爾排序是首先將陣列分成若干子陣列(一般子陣列的個數是n/2或者n/m,n是陣列長度,m是分隔間距),然後每個子陣列進行插入排序;再縮減增量(一般縮減增量表達式是

演算法(第四版)學習筆記java實現插入排序

插入排序:插入排序是在遍歷元素的過程中,當前索引左邊的所有元素都是有序的,但最終位置是不確定的;當前索引右邊的所有元素都是待排序的,而排序的過程就是逐漸將索引右邊的無序的元素按照自己制定的排序規則插入

插入排序Java實現

sort create reat -- 安排 spa nbsp 選擇 void 插入排序類似於大多數人安排撲克牌的方式。 1、從你手中的一張牌開始, 2、選擇下一張卡並將其插入到正確的排序順序中, 3、對所有的卡重復上一步。 /** * * 代碼理

快速排序算法 java實現

基準 ++ code 大於 java oid 序號 while 算法 1 public class QuickRank { 2 public static void main(String[] args) { 3 int[] original={26,58,

算法(第四版)學習筆記java實現可以動態調整數組大小的棧

length pub move sta gen font -c @override lifo 下壓(LIFO)棧:可以動態調整數組大小的實現 import java.util.Iterator; public class ResizingArrayStack&l

歸並排序及優化(Java實現)

繼續 soft local == else 歸並排序 right 數據 cal 普通歸並排序 public class MergeSort { /** * @param arr 待排序的數組 * @param left 本次歸並

十大排序算法Java實現

nbsp main 計數 計數器 希爾 sele style div lec 1.冒泡排序Bubble Sort public class BubbleSort { public static void main(String[] args) {

必須知道的八大種排序演算法【java實現

各種演算法的時間複雜度: package com.lianxi; import java.util.Arrays; public class Sort { /** * 八種排序演算法 */ public static void main(String[] args) {

八種經典排序演算法和java實現

文章目錄 演算法概述 演算法分類 演算法複雜度 相關概念 1.氣泡排序(Bubble Sort)

總結幾種排序演算法的Java實現

1、氣泡排序 氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。 Java程式碼: import java.util.Random; public class BubbleSort { /** * 改進的氣

資料結構Java實現底層Set

Set也是一種重要資料結構,其特點為不允許出現重複元素,不保證集合中的元素順序,可以有元素為null但只允許出現一次。首先定義了一個Set介面,根據前面幾篇文章實現的連結串列和二分收索樹實現Set資料結構,下面是實現過程 Set介面 public interface Se