演算法入門(一)排序之桶排序

2021-10-08 01:50:49 字數 2219 閱讀 1924

當我們需要對一組資料(無序)進行排序時,假設期末考試完了,老師要按照分數對大家的名次進行排序,這裡假設五個同學分別考了 5分、3分、5分、2分、8分 (滿分十分)。當然,我們一下子就看出了其中的奧妙,但是我們用程式該怎麼寫呢?

我們可以建立乙個大小為11的陣列(因為這裡統計的是0到10之間的數字出現次數),現在我們有11個變數,即從a[0]~a[10],剛開始我們將陣列中所有的變數a[0]~a[10]的初始值設定為0(即這些分數沒有人得過)。即a[0] = 0; 代表沒人得過0分,a[1] = 0; 代表沒人得過1分。

接下來我們開始處理每乙個人的分數,若該分數出現一次,其對應的陣列下標的值加一,即第乙個同學的分數為5分,代表分數5出現一次,則相對應的a[5]++; 即現在a[5] = 1。

以此類推:第二個同學的分數為3分,此時3分出現一次,其對應的陣列下標的值加一,則對應的a[3]++; 即a[3] = 1。

然後我們分別拿到2分,5分,8分(第三個同學的成績也是5分,則a[5]原來值為1的基礎上再加一,a[5]++; a[5] = 2)

//迴圈讀入五個0-10內的整數

for (i = 0; i < 5; i++)

//第一層迴圈依次判斷arr[0]-arr[10]中的值

for (i = 0; i <= 10; i++) }}

執行結果:

要想從大到小排序,將for (i = 0; i <= 10; i++)改為for (i = 10; i >= 0;  i--)即可。

這個演算法就好比有 11 個桶,編號從 0~10。每出現乙個數,就在對應編號的桶中放乙個 小旗子,最後只要數數每個桶中有幾個小旗子就 ok 了。例如 2 號桶中有 1 個小旗子,表示 2 出現了一次;3 號桶中有 1 個小旗子,表示 3 出現了一次;5 號桶中有 2 個小旗子,表示 5 出現了兩次;8 號桶中有 1 個小旗子,表示 8 出現了一次。

當然,我們可以想一下,這個演算法是十分浪分空間的,當我們要統計要排序數的範圍是 0~2100000000 之間,那你則需要申請 2100000001 個變數,也就是說要寫 成 int a[2100000001]。因為我們需要用 2100000001 個「桶」來儲存 0~2100000000 之間每一 個數出現的次數。即便只給你 5 個數進行排序(例如這 5 個數是 1、1912345678、2100000000、 18000000 和 912345678),你也仍然需要 2100000001 個「桶」,這真是太浪費空間了!還有, 如果現在需要排序的不再是整數而是一些小數,比如將 5.56789、2.12、1.1、3.123、4.1234 這五個數進行從小到大排序,這就顯得無法實現了。

顯然,簡化版桶排序演算法,其本質上還不能算是乙個真正意義上的排序演算法,其有很大的侷限性,作為排序入門了解一下就可以了。

簡化版桶排序,用陣列角標值從0自增的方式記錄該角標(即輸入的數字)出現的次數,然後遍歷陣列根據對應角標值的大小確認列印該角標的次數(即數字出現的次數)。

演算法新手上車,請多指教!

演算法(一)排序

一 o n 2 的排序演算法 1.選擇排序 selection sort 先找到最小的 public static void selectsort int arr 2.氣泡排序 bubble sort 先找到最大的 public static void bubblesort int arr 3.插入...

演算法(一) 排序sorting

問題 輸入數字a1,a2,a3.an,使其公升序輸出。1 插入排序 insertion sort 演算法 這個演算法從陣列的第二個元素開始迴圈,將選中的元素與之前的元素一一比較,如果選中的元素小於之前的元素,則將之前的元素後移,最後再將選中的元素放在合適的位置。在這個演算法執行的過程中,總是保持著索...

9 排序演算法 桶排序

桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。為了使桶排序更加高效,我們需要做到這兩點 在額外空間充足的情況下,盡量增大桶的數量 使用的對映函式能夠將輸入的 n 個資料均勻的分配到 k 個桶中 同時,對於桶中元素的排序,選擇何種比較排序演算法對於效能的影...