用C實現堆排序

2021-08-16 15:27:06 字數 1506 閱讀 7625

堆排序(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...