堆排序《一》 簡單結構堆排序

2021-08-09 01:46:25 字數 1330 閱讀 2558

堆排序:

利用最大堆/最小堆完成排序

用陣列儲存,但邏輯結構為 完全二叉樹

heapelem arr = ;

物理結構:

邏輯結構:

i = 3 (要調整的結點)

j= i*2+1 (左孩子結點)

對 3 7 8 進行判斷,已符合最小堆規則 則不調整 break

arr[i] = tmp;

–pos // 開始迴圈調整 2位置的 while(pos>=0)

普通結構堆排序

#include 

#include

typedef

int heapelem ; // 定義堆排序時資料型別

template

void swap(type &a,type &b) // 交換函式

void fileterdown(heapelem *p,int start,int end) // 向下調整

p[i] = tmp;

}void makeminheap(heapelem *p ,int n)

int end = n-1 ; // 找出最後乙個結點下標

int pos = (end -1)/2; // pos為end的雙親結點

while(pos>=0)

}void heap_sort(heapelem *p,int n)

}void printheap(heapelem *p ,int n)

printf("\n");

}void main()

; int n = sizeof(arr)/sizeof(arr[0]);

makeminheap(arr,n);

heap_sort(arr,n);

printheap(arr,n);

}

測試結果:

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

資料結構 堆排序 堆排序 Heap Sort

堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...