堆和堆排序:為什麼說堆排序沒有快速排序快?堆:堆排序互動資料次數比快排的多
/*
* @author: hotsuitor
* @date: 2020-03-19 16:01:22
* @lasteditors: hs
* @lastedittime: 2020-03-19 22:44:45
* @description: [email protected]
*/// 堆
const heap =
[undefined,33,
27,21,
16,13,
15,9,
5,6,
7,8,
1,2]
;class
heap
// 根節點索引=1,左子節點=2*i,右子節點=2*i+1, i=層數
insert
(data)
if(len ===0)
this
.heaparray.
push
(data)
;let currentindex =
this
.heaparray.length -1;
let i;
// 層數,從0開始
let parentindex;
//! 奇數->跟、右節點,偶數->左節點
parentindex = currentindex %2?
(currentindex -1)
/2: currentindex /2;
// 父節點的索引
// 自下往上堆化
while
( parentindex >0&&
this
.heaparray[currentindex]
>
this
.heaparray[parentindex])}
// 刪除堆頂元素
deletetop
(data)
}scan()
swap
(arr, i, j)
}class
heap2
// 建堆
static
buildheap
(arr)
return arr;
}static
heapify
(arr, n, i)
}insert
(data)
}static
deletetop
(arr)
return result;
}scan()
static
swap
(arr, i, j)
swap
(arr, i, j)
// 堆排序
static
sort
(arr)
return result;}}
// let heap2 = new heap(heap);
// heap2.insert(22);
// heap2.insert(23);
// console.log(heap2.scan());
// heap2.deletetop();
// heap2.deletetop();
// console.log(heap2.scan());
// let heap3 = new heap(, 5);
// heap3.insert(23);
// heap3.insert(27);
// heap3.insert(33);
// heap3.insert(45);
// heap3.insert(22);
// console.log(heap3.scan());
// heap3.deletetop();
// console.log(heap3.scan());
// let heap4 = new heap2(5);
// heap4.insert(33);
// heap4.insert(23);
// heap4.insert(45);
// heap4.insert(22);
// heap4.insert(7);
// console.log(heap4.scan());
let arr1 =[,
3,44,
23,18,
39,26,
77];let arr2 =
[...arr1]
;let arr1heap = heap2.
buildheap
(arr2)
;console.
log(
"arr1"
, arr1)
;console.
log(
"arr1heap"
, arr1heap)
;console.
log(
"heapsort"
, heap2.
sort
(arr1heap)
);
二叉堆(完全二叉樹)
最小堆的實現 最小堆是一顆完全二叉樹 這裡用陣列實現完全二叉樹 index 0 1 2 3 4 5 6 value 空 a b c d 任意index,其父親為index 2,左兒子為2 index,右兒子為2 index 1 時間複雜度 o logn include includeusing na...
二叉堆 完全二叉樹 優先佇列
完全二叉樹的邏輯結構是樹結構,但由於其特殊性,資料結構中常用陣列來儲存.訪問父節點,左子結點,右子節點都很方便 陣列儲存以1為起點 假設有某一結點u a u 2 為其父節點,當且僅當u 1 a u 2 為其左子結點,當且僅當u 2 n a u 2 1 為其右子節點,當且僅當u 2 1 n inclu...
完全二叉樹 堆 紅黑樹
完全二叉樹 對於乙個樹高為h的二叉樹,如果其第0層至第h 1層的節點都滿。如果最下面一層節點不滿,則所有的節點在左邊的連續排列,空位都在右邊。這樣的二叉樹就是一棵完全二叉樹。定義 堆樹是一顆完全二叉樹 堆樹中某個節點的值總是不大於或不小於其孩子節點的值 堆樹中每個節點的子樹都是堆樹。當父節點的鍵值總...