基數排序 (Radix Sort).

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

LED CUBE 預期規劃.
計算機程式語言實習課.
禁毒知识教育 ·.
“八皇后”问题 崔萌萌 吕金华.
第5章 排序与查找 PART A 《可视化计算》.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
輔助記憶體.
第八章 排序 8-1 排序簡介 8-2 內部排序法 8-3 外部排序法.
主題五 CPU Learning Lab.
課程名稱:資料結構 授課老師:_____________
DreamWeaver MX (II) 林偉川.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
JDK 安裝教學 (for Win7) Soochow University
排序 Sorting.
快速排序法 (Quick Sort).
第9章 排序.
第十章 排序與搜尋.
Analysis of Sorting Algorithms
4B冊 認識公倍數和最小公倍數 公倍數和最小公倍數的關係.
2-1 接腳說明 2018/11/30 第2章 系統分析.
Chapter 2 – Chapter 4 Chang Chi-Chung
程式撰寫流程.
類別(class) 類別class與物件object.
(Circular Linked Lists)
安裝JDK 安裝Eclipse Eclipse 中文化
第8章 排 序 8.1 排序技术概述 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序 8.6 基数排序
排序的相關知識 排序(Sorting)是指將一群資料,按特定規則調換位置,使資料具有某種次序關係(遞增或遞減)。
Sorting 排序 Bubble Sort O(n2) Insert Sort Selection Sort Quick Sort
Chap3 Linked List 鏈結串列.
第一單元 建立java 程式.
北一女中 資訊選手培訓營.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
數學 近似值 有效數值.
8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法 8-4 動態規劃技巧 8-5 計算難題
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
第8章 資料排序 資料結構設計與C++程式應用
Sorting in Linear Time.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
第 十 章 排序(Sorting) 課程名稱:資料結構 授課老師:________ 2019/4/20.
挑戰C++程式語言 ──第8章 進一步談字元與字串
蕭志明 老師 Algorithm(演算法) Ext:6779
蕭志明 老師 Algorithm(演算法) /FB:
Teacher: 郭育倫 Mail: 演算法 Teacher: 郭育倫 Mail:
C qsort.
13.1 氣泡排序 13.2 選擇排序 13.3 插入排序 13.4 合併排序 13.5 快速排序
程式設計-- Binary Search 通訊一甲 B 楊穎穆.
累堆排序法 (Heap Sort).
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
陣列與結構.
資料表示方法 資料儲存單位.
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
資料結構 老師:李崇明 助教:楊斯竣.
資料結構 老師:李崇明 助教:楊斯竣.
All Sources Shortest Path The Floyd-Warshall Algorithm
插入排序的正确性证明 以及各种改进方法.
JAVA 程式設計與資料結構 第十九章 Sorting.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Array(陣列) Anny
SQLite資料庫 靜宜大學資管系 楊子青.
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
Chapter 4 Multi-Threads (多執行緒).
Unix指令4-文字編輯與程式撰寫.
微 處 理 機 專 題 – 8051 C語言程式設計 主題:階乘計算
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

基數排序 (Radix Sort)

前面的排序技巧都是基於比較和移動欲排序的元素,而基數排序法(Radix sort)不做任何比較。若使用連結資料結構時,也不需移動元素。

定義 基數排序法的基本運算是將元素自一個連結串列上取出,加至另一個連結串列上。 若每個元素的排序項目最多含有k個字元,而每個元素將重新連結n次。所以共需k*n次重新連結運算的工作量。 這是一個很有用的解決方法,因為對於任意資料的排序,比較大小的的方式來排序的演算法則,至少(nlogn)次元素比較才能完成排序的。

基本運算 尚未排序: 字元值:

個位數排序: 字元值: 第一步是根據整數的最小位數,將整數加到某個串列上,我們稱為字元串(character lists)。對於每個可能出現的字元值必須存在一個字元串列。在本例串列出現的字元值是0、1、…、9。

十位數排序: 字元值: 第二步是取出個位數排序的整數,將它們依據其十位數值,加入適當的字元串列上,其結果如圖2示。將這些串列依序連結起來可以產生十位數排序的資料。

最後排序的結果如下: 015,56,107,228,312,371,452,456,575,714,749,833 最後第三步,是將每個整數依據其最大位數(百位數)值,放入適當的字元串列中,其過程如圖9-8-3所示。將這些串列依序連結之後,就完成了基數排序法

演算法 演算法=>C語言程式碼 msd_sort(int a[ ], int b [ ], int l, int r, int factor) { int i, j, v, count [l ], c [ l ] ; for ( i =0 ; i < l ; i + +) count [ i ] = 0 ; for ( i =l ; i <= r ; i + +) v = a [ i ] / factor % 10 ; count [ v + l ] + + ; }

c [ 0 ] = 0 ; for ( i = 1 ; i < l ; i + + ) { count [ i ] += count [ i – 1 ] ; c [ i ] = count [ i ]; } for ( i = 1 ; i <= r ; i + + ) j = a [i ] / factor % 10 ; b [count [ j ] + + ] = a [ i ] ;

for ( i = 1 ; i <= r ; i + + ) a [i ] = b [ i –1 ] ; factor /= 10 ; for ( i = 0 ; i < 10 ; i + + ) { j = c [i ] + l ; v = c[i +l ] +l –1 ; if ( v > j && factor > 0 ) msd_sort( a, b, j, v, factor ) ; }

=>時間複雜度分析 基數排列的分類是穩定的情況 所需的平均的時間複雜度均為O(nlogr m),r是所採用的數字系統基底,m是堆數。 在某些情況下,所需的時間是O(n),所需的空間很大,需要(n * n),n為記錄數。

程式範例-基數排序 #include <studio.h> void adjust ( int [ ], int ) ; int data [10] = { 75, 23, 98, 44, 57, 12, 29, 64, 38, 82 } ; void main ( ) { int i , j, k - 0, lst, temp [10] [10]

int order ([10]) = {75,23,98,44,57,12,29,64,38,82} ; printf ( “\n << Rp sort >>\n ) ; printf ( “Number : “ ) for ( i = 0; i <= 10; i ++) printf ( “%d “, data [i] ); puts (“ “); for ( i = 0 ; i < 60, i ++ ) printf ( “-“) ; while ( n <= 10 ) {

for ( i = 0 ; i < 10; i ++) { lst = ((data [i] / n ) % 10 ) temp [lsd] [order [lsd] ] = data [i] ; order [lsd] ++; } printf ( “\nAccess : “ ) ; for ( i = 1; i < 10; i ++) for ( j = 0 ; j < order [i] ; j ++ ) data [k] = temp [ i ] [ j ] ; printf ( “%d “, data [k] ) ; k ++ ;

order [ i ] = 0 ; } n * = 10 ; k = 0 ; puts ( “ “ ) ; for ( i = 0; i < 60; i ++) printf ( “-“ ) ; printf ( “\nSorting : “ ) ; for ( i = 1; i < 10; i ++) printf ( “%d “, data [ i ]) ;

外部排序法 External Sort

當資料量太大時,我們無法將資料一次全部放在主記憶體中做處理,又由於現今電腦的主記憶容量增加的速度遠低於儲存設備,所有大量的資料還是儲存於外部儲存裝置中。

定義 外部排序最常用的方法是合併排序法,它先將檔案分段,每一段檔案用內部排序法加以排序之後再將它們寫到外部儲存裝置; 排序過後的各段資料稱為行程runs),將各行程利用合併排序法逐漸合併,直到最後一個行程為止。

各種排序法的比較 考慮下列幾方面: 時間複雜度 空間複雜度 穩定性 演算法簡單程度 資料數目 資料記錄本身的大小

時間複雜度與穩定性 類別 排序法 平均時間 最差狀況 穩定度 內部 氣泡排序 Bubble O(n2) 不穩定 插入排序 Insertion 選擇排序 Selection 謝爾排序 Shell O(nlogn) O(ns)1<S<2 快速排序 Quick 累堆排序 Heap 二元排序 Binary tree 不一定 外部 合併排序 Merge

穩定度:相同的數值排序後順序是否和排序前順序相同.若'是'稱為穩定,若'不是'稱為不穩定. 平均時間:程式平均執行次數. 最差狀況:程式最差執行次數. 穩定度:相同的數值排序後順序是否和排序前順序相同.若'是'稱為穩定,若'不是'稱為不穩定. 類別:分為2類 內部排序 適合於所有資料可以寫入記憶體中. 外部排序 適合於所有資料無法全部寫入記憶體中,需使用輔助記憶體。

空間複雜度 合併排序法與基數排序法的空間複雜度為O(N) 快速排序法需要O(logN) 而其他排序法皆為O(1)。

簡單性 插入、選擇、及泡沫排序法的演算法都比較直接而簡單,而改良排序法則比較複雜。 當資料的數目很小時,由於N2與Nlog N的值差異不大 可以選擇較簡單易寫的排序法 當資料數目很大時 應該採用改良後的排序法