1. 程式人生 > >簡化的桶排序(Bucket Sort)

簡化的桶排序(Bucket Sort)

本文參考 http://ahalei.blog.51cto.com/4767671/1362789 

上文的作者說還不算是嚴格意義上的桶排序,因為它只能排序數字,沒有實際效用,不過我覺得這個演算法的思想挺有意思,所以拿來練手:設定一個數組,陣列長度即數字的出現範圍,例如0~1000.通過該陣列統計每個數字出現的次數,來實現排序列印。之所以稱為桶排序,是因為陣列就像一個桶,資料就像一面旗子,每個桶都做了標記,對應的資料出現一次,旗子數就加1.

簡化的桶排序缺點:浪費地址空間,需要預先申請空間以記錄所有可能出現的情況。而且只能排整數,小數/結構體物件就不能排。

#include <stdio.h>

int main()
{
    int num,record,bucket[1000],i,j;

    //init bucket
    for(i=0;i<1000;i++)
    {
        bucket[i]=0;
    }

    printf("how many number will you input:\n");
    scanf("%d",&num);
    printf("Let's begin to input num between 0~1000:\n");

    for(i=0;i<num;i++)
    {
        scanf("%d",&record);
        bucket[record]++;
    }

    for(i=1000;i>=0;i--)
        for(j=0;j<bucket[i];j++)
            printf("%d ",i);

    printf("\n");
    getchar();

    return 0;
}


執行結果

[email protected]:~/learning/sample code/algrithm/sort/bucket$ ./simple_bucket.o
how many number will you input:
7
Let's begin to input num between 0~1000:
20
30
50
44
33
33
50
50 50 44 33 33 30 20



相關推薦

簡化排序Bucket Sort

本文參考 http://ahalei.blog.51cto.com/4767671/1362789  上文的作者說還不算是嚴格意義上的桶排序,因為它只能排序數字,沒有實際效用,不過我覺得這個演算法的思想挺有意思,所以拿來練手:設定一個數組,陣列長度即數字的出現範圍,例如0

排序演算法4- 排序Bucket Sort

原理 準備m個箱子(m為待排序陣列的最大值+1),依次在下標為元素大小的箱子上做標記。最後根據有標記的箱子的下標和標記數量,從小到大放入陣列中,得到排序完成的陣列。 注意點 適合大數

排序Bucket sort

桶排序思想: 桶排序的基本思想: 假設有一組長度為N的待排關鍵字序列K[1….n]。首先將這個序列劃分成M個的子區間(桶) 。然後基於某種對映函式 ,將待排序列的關鍵字k對映到第i個桶中(即桶陣列B的下標 i) ,那麼該關鍵字k就作為B[i]中的元

排序算法之歸並排序Merge Sort

ast 子序列 排序 ges 一個 delet oid ear sys 基本思想   歸並(Merge)排序法是將兩個(或兩個以上)有序表合並成一個新的有序表,即把待排序序列分為若幹個子序列,每個子序列是有序的。然後再把有序子序列合並為整體有序序列。 代碼實現    #i

快速排序Quick Sort

sin aik tex 狀態 整體 splay 好的 優化 return 基本思想:   通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對著兩部分記錄進行排序,以達到整體有序的目的。 通俗點說就是:   在待排記錄中

計數排序Counting Sort

反向 length strong 填充 進行 tin 排序 等於 clas 計數排序的核心在於將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。 作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。 計數排序(Counting sort)是一種穩定的

選擇排序Selection sort

選擇排序算是對氣泡排序的一種改進:假設有n個待排列的資料,在第一輪遍歷中,仍進行n - 1次比較,遍歷的時候用當前數與當前獲得的最大數進行比較,而不是相鄰的資料進行比較,且僅進行一次資料交換。而氣泡排序在每一次比較的過程中,發現數據順序不一致就交換,資料交換的次數更多。選擇排序只需要用標記記住每一輪的最大數,

一、選擇排序Selection sort

一、選擇排序         選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素

排序演算法(六):快速排序Quick Sort

基本思想: 1)選擇一個基準元素,通常選擇第一個元素或者最後一個元素, 2)通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的 元素值比基準值大。 3)此時基準元素在其排好序後的正確位置 4)然後分別對這兩部分記錄用同樣

排序演算法(五):氣泡排序Bubble Sort

基本思想: 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。 氣泡排序的示例:   演算法的實現: public v

排序演算法(四):堆排序Heap Sort

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。 基本思想: 堆的定義如下:具有n個元素的序列(k1,k2,...,kn),當且僅當滿足 時稱之為堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最小項(小頂堆)。 若以一維陣列儲存一個堆,則堆對應一棵完全二叉樹,且所有

排序 heap sort C# 實現

main 函式中呼叫:            var data = new int[] {5,7,6,4,1,9,3};             heapSort(data);

十大經典排序演算法之選擇排序Selection Sort

選擇排序(Selection-sort)是一種簡單直觀的排序演算法。 它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。  2.1 演算法描

排序演算法】氣泡排序Bubble Sort

一、簡介 氣泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。 二、

排序算法】冒泡排序Bubble Sort

就是 思路 bubble 進行 ref bool 除了 優化 private 一、簡介 冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交

歸併排序Merging Sort- java實現

學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版 歸併排序(Merging Sort)是又一類不同的排序方法。“歸併”的含義是將兩個或兩個以上的有序表組合成一個新的有序表。 利用歸併的思想容易實現排序。假設初始化序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸

排序Heap Sort- java實現

學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版 過於複雜,理解的不夠透徹,只存放程式碼部分 1、建立堆: /** * 由於使得陣列元素遞增排序,所以先建一個“大頂堆”,即先選得一個關鍵字為最大的記錄並與序列中最後一個記錄交換 * 所以,每次訪問陣列會是n-i * @param a

算法系列——選擇排序Selection Sort

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。時間複雜度是O(n^2)。 在完全隨機陣列的條件下

十大經典排序演算法之插入排序Insertion Sort

插入排序(Insertion-Sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆

雙調排序Bitonic sort學習

之前的時候參加浙大的考核,學習了一下雙調排序,正好現在在學習CUDA程式設計,因此把之前的學習成果整理一下。 問題說明:  ***********************  給出分成m段 的n個浮點數,輸入資料已按段號有序,但每段內部 無序。用C/C++ 編寫一個分段雙調