堆排序法(Java C C 實現)

2021-08-28 18:46:56 字數 1834 閱讀 3562

堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 o(n * lg n)。

介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。

除最底層外,該樹是完全充滿的,且是從左到右填充。

樹的根結點是 a[ 1 ],若某一結點下標為 i,則很容易得到它的父節點為 i/2,左子結點為 2i,右子結點為 2i + 1。

注意:陣列的索引是 0 開始的,其左右子結點分別為 2i + 1 和 2i + 2。

最大堆即父結點的值大於等於子結點的值;最小堆即父結點的值小於等於子結點的值。

堆是乙個很有用的資料結構,它的乙個常見應用即:優先佇列

主要是 3 個方法:

heapsort() 方法進行堆排序,裡面會呼叫 buildheap() 方法和 maxheapify() 方法。

buildheap() 方法將乙個陣列構建為乙個最大堆。

maxheapify() 方法調整堆,使得這個堆滿足最大堆的性質。

public class main ;

heapsort(arr);

printarray(arr);

}public static void heapsort(int arr)

}public static void buildheap(int arr)

}public static void maxheapify(int arr, int index, int heapsize)

// 如果右子結點比 max(this, left)還大,則將最大值索引設為右子節點

if (rightindex < heapsize && arr[rightindex] > arr[maxindex])

// 如果當前結點的值不是最大的,則需要交換最大值,並繼續遍歷交換後的子結點

if (maxindex != index)

}public static void printarray(int arr)

system.out.println();}}

**實現基本沒什麼差異。

#include void swap(int *a, int *b)

void maxheapify(int *arr, int index, int heapsize)

// 如果右子結點比 max(this, left)還大,則將最大值索引設為右子節點

if (rightindex < heapsize && arr[rightindex] > arr[maxindex])

// 如果當前結點的值不是最大的,則需要交換最大值,並繼續遍歷交換後的子結點

if (maxindex != index)

}void buildheap(int *arr, int length)

}void heapsort(int *arr, int length)

}void printarray(int *array, int length)

}int main()

; heapsort(arr, sizeof(arr) / sizeof(arr[0]));

printarray(arr, sizeof(arr) / sizeof(arr[0]));

return 0;

}

1 2 3 4 7 8 9 10 14 16

堆排序法 題目

題目內容 實作max heap的三種操作 push,pop,top。指令0 x 代表push,將x push進max heap。指令1 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。指令2 代表top,將最大的數字印出來,若heap為空則忽略這道指令。輸入格式 本題只有一道測資。...

堆排序實現

今天抽空寫了個堆排序的演算法,廢話不多說,直接上源 include include includeusing namespace std define maxsize 6 void print int a,int size maxsize void percolate up int a,int si...

堆排序實現

1 堆排序演算法描述 1 定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 2 當然,這是小根堆,大根堆則換成 號。k i 相當於 二叉樹的非 葉子結點,k 2i 則是左子節點,k 2i 1 是右子節點...