堆排序(heapsort)是指利用堆積樹(堆)這種 資料結構所設計的一種 排序演算法,它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是 完全二叉樹。
本次堆排序利用了小根堆堆頂記錄的 關鍵字最小這一特徵,使得在當前無序區中選取最小關鍵字的記錄變得簡單。
用小根堆排序的基本思想:
① 先將初始檔案r[1..n]建成乙個小根堆,此堆為初始的無序區
② 再將關鍵字最小的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≥r[n].key
③由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最小的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≥r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。
直到無序區只有乙個元素為止。
**:
標頭檔案:
heapsort.h
#pragma once
#include
#include
#include
#include
#include
void sort_swap(int *left, int *right);
void adjustheap(int *arr, int size, int parent);
void heapsort(int *arr, int size);
原始檔:
heapsort.c
#include"heapsort.h"
void sort_swap(int
*left, int
*right)
void adjustheap(int
*arr, int
size, int
parent)//向下調整
if (arr[child] < arr[parent])
else
return;
}}void heapsort(int
*arr, int
size)
while (end > 0)//最後乙個節點與跟節點交換後,size--,只有根節點不滿足堆,調整
}void heap_print(int
*arr, int
size)
printf("\n");
}void test()
; heap_print(arr, sizeof(arr) / sizeof(arr[0]));
heapsort(arr, sizeof(arr) / sizeof(arr[0]));
heap_print(arr, sizeof(arr) / sizeof(arr[0]));
}
用C 實現堆排序
極大堆 排序後從小到大 是具有以下性質的完全二叉樹,每個結點的值都大於等於左右結點的值 下面是使用極大堆的方式進行排序,使用極小堆的排序原理差不多。include using namespace std void heapadjust int a,int s,int n void heapsort ...
用python實現堆排序
一 概念 將剩餘的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞迴實現 剩餘部分調整為最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整為最大堆,這個過程持續到剩餘數只有乙個時結束 coding utf 8 author alex li import time,random defsift dow...
c 實現堆排序
include include include using namespace std 對比枝節點和左右子節點,將比較大的節點放置於枝節點 template int heapadjust t t,int i,int size if rightchild size t rightchild t max...