堆排序是利用堆的性質進行的一種選擇排序。
1. 將初始待排序關鍵字序列(r1,r2....rn)構建成大頂堆,此堆為初始的無序區。
2. 將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,......rn-1)和新的有序區(rn),且滿足r[1,2...n-1]<=r[n]。
3 .由於交換後新的堆頂r[1]可能違反堆的性質,因此需要對當前無序區(r1,r2,......rn-1)調整為新堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序(r1,r2....rn-
2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。
#include #include #include using namespace std;
#define error 1
#define ok 0;
typedef int status;
typedef struct heap *maxheap;
/* 以n為結點不是堆,左子樹是堆,右子樹是堆,調整為乙個堆,方法是向下過濾 */
status percdown(maxheap mh, int n)
else
break;
}mh->parray[parent] = temp;
return ok;
}/* 建造最大堆 */
status buildheap(maxheap mh)
/* 交換陣列元素 */
void swap(int *pa, int *pb)
/* 堆排序 */
status shell_sort(int a, int n)
return ok;
}int main()
;
for(i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d ", a[i]);
printf("\n");
shell_sort(a, sizeof(a) / sizeof(a[0]));
for(i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d ", a[i]);
printf("\n");
system("pause");
return 0;
}
資料結構基礎整理 排序 03 堆排序
堆排序 英語 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆是具有以下性質的一棵樹 s是要需要調整堆結構的順序表的下標元素 調整完後使之成為大頂堆,m是堆的大小 void he...
資料結構基礎 19 堆與堆排序
首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...
資料結構基礎 19 堆與堆排序
首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...