累堆排序法 (Heap Sort).

Slides:



Advertisements
Similar presentations
办公室保健指南. 减少辐射篇 ❤显示器散发出的辐射多数不是来自它的正面,而是侧面和后面。因此,不要 把自己显示器的后面对着同事的后脑或者身体的侧面。 ❤常喝绿茶。茶叶中含有的茶多酚等活性物质,有助吸收放射性物质。 ❤尽量使用液晶显示器。
Advertisements

魏 饴. 处级干部培训班讲座 一、卓越干部的德行素质  常修为政之德、常思贪欲之害、常怀律己之心!  孔老夫子有个观点 “ 为政以德,譬如北辰居其所而众星拱之。 ”  司马光《资治通鉴》 “ 才者,德之资也;德者,才之帅也。 ” “ 德 ” 胜 “ 才 ” 谓之 “ 君子 ” , “ 才 ”
While 迴圈 - 不知重複執行次數
1.1 程序和程序设计 程 序:简单的说程序就是指令的集合。 计算机设计语言: 机器语言 :二进制 0 、 1 汇编语言:助记符(英语单词)。 高级语言: 人类自然语言(数学语言 + 英语) 如: C 语言、 Qbasic 、 VB 等 第一章:程序设计基本概念.
一、真愛密碼 二、尋求真愛 三、有自尊的愛. 。如果雙方對愛情產生 質疑、困惑時,則表示 彼此之間的愛情關係仍 有 待加強或釐清,千萬別 急著為自己的人生大事 下決定。 我是一個 16 歲的未婚媽媽,發現自 己懷孕時,已經五個月大了,我知 道自己沒能力照顧孩子,在驚訝之 於,大人們只好坦然接受,幫我找.
大地遊戲王 課程實錄.
河內塔(Hanoi)問題.
加強水銀體溫計稽查管制及回收 回收作業須知及緊急應變措施
考点作文十大夺魁技法 第28课时 写作(二) 考点作文十大夺魁技法 6-10 ·新课标.
第4章 分錄及日記簿 4-1 借貸法則 4-2 日記簿的格式及記錄方法 4-3 分錄的意義及記錄方法 4-4 常見分錄題型分析
舊石器時代 位置: 亞洲大陸東緣,西太平洋弧狀列島一部份 背景 形成: 兩千多萬年前逐漸隆起,形成島嶼 生物: 大角鹿、猛瑪象、亞洲大陸原始人 臺東 長濱文化 苗栗 網形文化 臺南 左鎮人目前臺灣發現最早人類化石 代表 文化 1.住在海邊洞穴-短期定居小型隊群 2.以採集、狩獵為生 3.使用礫石砍伐器、片器、尖器.
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
计算机三级考试C语言上机试题专题.
“八皇后”问题 崔萌萌 吕金华.
第十三屆 Step.1 我們的目標 Step.2 我們的角色 Step.4 權利與義務 義務 權利 年繳會費五百元整
财务管理.
植物保护 课程整体设计 汇报 申报省级精品资源共享课建设 植物保护课程组.
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
政府扶持资金通览 技术改造篇.
課程名稱:資料結構 授課老師:_____________
本科生医保资料的提交.
Linked List Operations
C语言程序设计 第十二章 位运算.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
程序设计基础.
高级语言程序设计 主讲人:陈玉华.
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
第8章 圖形結構(Graphs) 8-1 圖形的基本觀念 8-2 圖形的表示法 8-3 圖形的走訪 8-4 擴張樹
排序 Sorting.
快速排序法 (Quick Sort).
第9章 排序.
If … else 選擇結構 P27.
搜尋資料結構 Search Structures.
統計圖表的製作.
程式撰寫流程.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第8章 排 序 8.1 排序技术概述 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序 8.6 基数排序
第八章 使用指针.
計數式重複敘述 for 迴圈 P
第十章 指针.
《结构力学认知实验》(授课形式)的上课时间改为: 5月5日(周二)晚上18:00~19:30和19:30~21:00,
《结构力学认知实验》(授课形式)的上课时间改为: 5月7日(周四)晚上18:30~20:00和20:00~21:30,
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
程式的時間與空間 Time and Space in Programming
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
畢業資格審查系統 操作步驟說明.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
新制退休實務計算說明- 現職人員退休範例說明
中国农业科学院博士后学术论坛 博士后基金申请的经验及体会 中国农业科学院生物技术研究所 秦 华 博士
隨機數 (亂數) 10後,取餘數 n = rand(); 利用 Code::Block 驗證一下 n = rand() %10; 998
第七章  数 组.
106 學年度新生入學說明會 國立臺灣海洋大學 教務處簡介
學士學位畢業論文說明 逢 學 大 甲 土 理 管 地 2009/10/05.
第十二章 位运算.
高雄市97年度國民小學閱讀計畫創新教學-教案達人創新教學方案
算法的基本思想: 第6章 内部排序 6.2 气泡排序 将待排序的记录看作是竖着排列的“气泡”,关键字较小 的记录比较轻,从而要往上浮。
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
函式庫補充資料 1.
C语言基础学习 从外行到入门.
隨機函數.
教師檔案系統資料如何填寫? 如何對應教師評鑑共同基準?.
Presentation transcript:

累堆排序法 (Heap Sort)

從樹狀結構來看時,原資料是位在最低層(0層)而最高層的資料才是每一循環所要的。 如果原資料個數不多,資料從最低層到最高層的移動並不會影響排序效率太大, 但資料若很多時,或者是排序後面的幾次循環含有不必要的動作時,則排序效率則大受影響; 為了解決這個缺點,我們使用累堆排序(Heap Sort)法。

定義 累堆排序成功的減少選擇排序法的比對次數,是由John Williams所提出 利用二元樹的技巧,使每一筆資料的比對次數,不會大於logn的值,所以它的時間複雜度和快速排序法相同皆為O(nlogn),而且它不須任何多餘的記憶空間,它沒有使用到遞迴的函數呼叫。 累堆排序法首先將所有的資料排成一棵累堆樹(heap tree)

累堆樹的形成 它是一個完整二元樹; 所有子樹的根節點值均大於其左右子節點的值。 假設a[ ]資料有12,55,618,40,60,47,25,1,30,6,66;將它表示成完整二元樹如圖

12 55 618 40 60 47 25 1 30 6 66 完整二元樹  

將它調整成累堆樹,調整步驟如下: 令節點i為最後一個非終端節點:N為資料總量 節點j為節點i的左右子節點中較大者: if ( a[ 2*i + 1 ] > a [2 * i +2] ) j = 2 * i + 1 ; else j = 2 * i + 2 ; 如果節點i資料值小於節點j的資料值,則節點i、j交換,並且將i 值設為j值: if ( a[ i ] > a [ j ] ) swap ( a [i ] , a [ j ] ) ; i =j ; 如果節點i還有子節點則回到step 2 如果i大於0,則i = i –1,回到step 2

(a) 60與66交換 12 55 618 40 66 47 25 1 30 6 60

(b)55與66交換後,再與60交換 12 66 618 40 60 47 25 1 30 6 55

(c) 12與618交換後,再與47交換 618 66 47 40 60 12 25 1 30 6 55

基本運算 累堆樹由小至大排序的過程

(a) 618與55交換 55 66 47 40 60 12 25 1 30 6 a[ ] 1 2 3 4 5 6 7 8 9 10 值 55 66 47 40 60 12 25 30 618 排序完成

(b)調整55 66 60 47 40 55 12 25 1 30 6 a[ ] 1 2 3 4 5 6 7 8 9 值 66 60 47 40 55 12 25 30

(c) 66與6交換,調整6 60 55 47 40 6 12 25 1 30 a[ ] 1 2 3 4 5 6 7 8 9 值 60 55 47 40 12 25 30 66 排序完成

(d)66和30交換,調整30 55 40 47 30 6 12 25 1 a[ ] 1 2 3 4 5 6 7 8 值 55 40 47 30 12 25 60 排序完成

(e) 55與1交換,調整1 47 40 25 30 6 12 1 a[ ] 1 2 3 4 5 6 7 值 47 40 25 30 12 55 排序完成 

(f)47和1交換,調整1 40 30 25 1 6 12 a[ ] 1 2 3 4 5 6 值 40 30 25 12 47 排序完成

(g) 40與12交換,調整12 30 12 25 1 6 a[ ] 1 2 3 4  5 值 30 12 25 6  40 排序完成

(h)6和30交換,調整6 25 12 6 1 a[ ] 1 2 3 4 值 25 12 6 30 排序完成

(i) 25與1交換,調整1 12 1 6 a[ ] 1 2 3 值 12 6 25 排序完成

(j)12和6交換 6 1 a[ ] 1 2 值 6 排序完成

演算法 =>C語言程式碼 move_down(int a[ ], int from, int to) { int i, j, t ; i = from ; while ( i < to /2 ) j = i * 2 + 1 ; if ( j + 1 < to && a [ j ] < a [ j +1 ] ) j + + ; if (a [ i ] < a [ j ] )

{ t = a [ i ] ; a [ i ] = a [ j ] ; a [ j ] = t ; } i = j ;

heap_sort(int a[ ], int n ) { int i, t ; for ( i = n /2 – 1 ; i >= 0 ; i - -) ; move_down(a, i, n) ; for ( i = n – 1 ; i > 0 ; i - -) ; t = a [ 0] ; a [ 0 ] = a [ i ] ; a [ i ] = t ; move_down ( a, 0, i ) ; }

=>時間複雜度分析 累堆排序是不穩定的情況, 其最壞與平均的時間複雜度均為O(nlogn)。 所需的額外空間很少。

程式範例-累堆排序 #include <studio.h> void adjust ( int [ ], int ) ; int data [11] = {0, 75, 23, 98, 44, 57, 12, 29, 64, 38, 82 } ; void main ( ) { int i , k , temp ; printf ( “\n << Heap sort >>\n ) ; printf ( “Number : “ ) for ( k = 1; k <= 10; k ++) printf ( “%d “, data [k] ); puts (“ “);for ( k = 0; k < 60; k ++) printf ( “-“ ) ;

for ( i = 10 / 2 ; i > 0 ; i --) adjust ( i, 10 ) ; printf ( “\nHeap : “ ) ; for ( k = 1; k <= 10; k ++) printf ( “%d “, data [k] ) ; for ( i = 9; i > 0; i --) { temp = data [i+1] ; data [i+1] = data [1] ;

data [1] = temp ; adjust (1, i ); printf ( “\nAccess : “) ; for ( k = 1; k < 60; k ++) printf ( “%d “, data [k] ) ; } puts ( “ “ ) ; for ( k = 0; k < 60; k ++) printf ( “-“ ) ; printf ( “\nSorting : “ ) ; for ( k = 1; k < 60; k ++)

void adjust ( int i, int n ) { int j, k, dome = 0 ; k = data [i]; j = 2 * i ; while (( j <= n ) $$ ( done = = 0 )) if (( j < = n ) && ( data [ j ] < data [ j +1 ])) j ++ ; if (( j < n ) done = 1;

else { data [ j / 2 ] = data [ j ] ; j *= 2; } data[ j / 2 ] = k ;