堆排序。
此處所說的堆和記憶體儲存中的堆是兩碼事。
大頂堆,是一棵完全二叉樹,樹根的關鍵字最大,其子樹也是符合大頂堆的概念,儲存上可以用陣列實現。
堆的乙個很明顯的用途是找錶中的最大關鍵字非常快,取樹根即可。
1、堆排序的第乙個步驟是:建堆
把無序表調整為乙個大頂堆:
檔案buildheap.c
2、其次是對大頂堆取樹根,即刪除樹根,然後再對堆進行調整,使其符合大頂堆結構。刪除堆頂元素
檔案delheap.c
3、對堆進行排序。堆排序
檔案heapsort.c
檔案heapsort.h
檔案main.c
結果示例:
[lanux@localhost--debug--16:30]$./heapsort
array number fallow as:
597 28 530 832 822 433 127 93 35 466
402 255 557 753 555 624 875 367 435 412
33 692 365 827 333 837 618 626 760 316
218 949 334 738 383 748 171 500 434 196
559 826 43 116 181 588 730 56 547 757
459 570 51 416 990 967 845 608 593 605
516 403 157 443 734 530 783 895 623 217
684 182 635 319 880 806 500 212 853 47
959 904 210 602 912 200 569 757 400 163
955 907 556 704 942 882 826 725 778 51
the heap sort follow:
28 33 35 43 47 51 51 56 93 116
127 157 163 171 181 182 196 200 210 212
217 218 255 316 319 333 334 365 367 383
400 402 403 412 416 433 434 435 443 459
466 500 500 516 530 530 547 555 556 557
559 569 570 588 593 597 602 605 608 618
623 624 626 635 684 692 704 725 730 734
738 748 753 757 757 760 778 783 806 822
826 826 827 832 837 845 853 875 880 882
895 904 907 912 942 949 955 959 967 990
[lanux@localhost--debug--16:31]$
2010-12-03 17:19:13
演算法導論讀書筆記(6)堆排序
複雜度o nlgn 原址排序 集插入排序和歸併排序兩者的優點 計算給定節點下標i的父,左孩子,右孩子的下標 parent i return i 2 left i return 2i right i return 2i 1 最大堆 堆中最大元素存放在根結點 最小堆 堆中最小元素存放在根結點 從a i ...
程式設計珠璣讀書筆記 堆排序,小根堆
堆排序的關鍵是要實現siftup和siftdown。當建立完這兩個函式以後,排序乙個陣列只需要5行 演算法執行了n 1次siftup和siftdown,而每次操作的成本最多o lgn 所以執行時間為o nlogn include include define max 20 void swap int...
排序演算法讀書筆記
按關鍵字相等的記錄順序是否變化,分為穩定和不穩定 按儲存器不同分為內部排序和外部排序,外部是指數量很大,記憶體一次不能容納全部記錄,要訪問外存 按複雜度分簡單排序 普通排序和基數排序 按依據的原則不同分為插入排序 交換排序 選擇排序 歸併排序和計數排序。排序通常需要兩種操作 比較 移動記錄。1 平均...