基於陣列的堆排序演算法的C語言實現

2021-07-27 21:42:45 字數 1636 閱讀 6852

實現如下:

int getparent(int c);

int getleft(int p);

int getright(int p);

void swap(int *p1, int *p2);

void heap_sort(int *source, int

length);

void max_heapify(int *source, int

length, int loc);

void build_max_heap(int *source, int

length);

void heap_sort_iteration(int *source, int

length);

void max_heapify_iteration(int *source, int

length, int loc);

void build_max_heap_iteration(int *source, int

length);

int getparent(int c)

int getleft(int p)

int getright(int p)

void swap(int *p1, int *p2)

void max_heapify(int *source, int

length, int loc)

void build_max_heap(int *source, int

length)

}void heap_sort(int *source, int

length)

}void max_heapify_iteration(int *source, int

length, int loc)

}void build_max_heap_iteration(int *source, int

length)

}void heap_sort_iteration(int *source, int

length)

}

堆排序是不穩定原地的排序。

該程式中使用的陣列作為表示堆的資料結構,其計算左子女,右子女以及父節點的座標的方式如parent,left_child,right_child所示。

max_heapify使其保持最大堆的性質,假設p節點左右兩顆子樹都是最大堆,max_heapify使p節點保持最大堆的性質,選取p節點的左右子女中最大的與p節點交換,然後遞迴的對交換後的節點繼續進行max_heapify操作,直到到達葉子結點。max_heapify操作執行時間的漸近上界為ο(

h)h為待操作節點的高度。

build_max_heap將乙個陣列建立為最大堆,從最後乙個非葉子節點到根節點依次分別呼叫max_heapify函式即可。其操作時間的漸近確界為ο(

n)。

heap_sort函式對n個數進行堆排序,每次將最大堆的第乙個元素和最後乙個元素交換,得到最大的元素,將堆的元素個數減一後再對堆的根節點進行max_heapify操作,得到當前堆中最大元素,迴圈n-1次即可排序陣列。其操作時間的漸近確界為ο(

nlog

n)。

其上所有演算法複雜度計算方法見演算法導論第六章,涉及主定理不再贅述。

排序演算法的C語言實現 堆排序

堆 優先佇列 可以用於花費nlogn 時間的排序,基於該想法的演算法叫做堆排序。因為堆的根總是最大的或者最小的,所以我們可以先將輸入陣列轉換為最大或者最小堆,然後刪除最大 最小值 也就是刪除根。這在二叉堆的介紹中已經實現了。一種方法是將刪除的元素放入另乙個陣列,但是這樣會浪費一倍的記憶體空間。由於每...

c語言 實現堆排序演算法

今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...

堆排序的c語言實現

說到堆排序,其實就是首先建立乙個大頂堆或者小頂堆,然後把他的最頂上的元素輸出,然後讓最頂上的元素與最後的元素進行交換並刪除最後乙個元素,依次輸出則得到排好序的元素。具體 實現如下 已通過編譯並成功執行 includevoid swap int a,int x,int y void buildmaxh...