常見排序演算法 堆排序 與 小頂堆大頂堆

2021-09-28 07:00:05 字數 2226 閱讀 4097

大頂堆:完全二叉樹,每個結點的值都大於等於其左右孩子結點的值

小頂堆:完全二叉樹,每個結點的值都小於等於其左右孩子結點的值

#include #include #include #include using namespace std;

//小頂堆

class smalltopheap

virtual ~smalltopheap()

private:

vectorvec_heap; //idx: 元素下標

};//_idx:[i], lchild_idx:[2i+1], rchild_idx:[2i+2], parent_idx:[(i-1)/2]

void smalltopheap::init(vector&vec)

//從最後乙個非葉子節點開始

for(int idx = (this->vec_heap.size()-1-1)/2; idx >= 0; idx--)

}void smalltopheap::add(int elem)

int smalltopheap::del(int idx)

if(now_elem < old_elem)else

return old_elem;

}bool smalltopheap::empty()

//根節點至idx原來為小頂堆

void smalltopheap::heap_up(int idx)

this->vec_heap[idx] = this->vec_heap[parent_idx];

idx = parent_idx;

parent_idx = (idx-1)/2;

std::cout << idx << "===" << parent_idx << endl;

}this->vec_heap[idx] = elem;

}//idx為根節點的二叉樹原來為小頂堆

void smalltopheap::heap_down(int idx)

if(this->vec_heap[smaller_child_idx] >= elem)

this->vec_heap[idx] = this->vec_heap[smaller_child_idx];

idx = smaller_child_idx;

lchild_idx = 2 * idx + 1;

rchild_idx = 2 * idx + 2;

}this->vec_heap[idx] = elem;

}void smalltopheap::print()

std::cout << std::endl;

}//heap sort

void heapsort(vectorvec)

std::cout << std::endl;

//構造小頂堆

smalltopheap heap;

heap.init(vec);

//vectornew_vec;

while(!heap.empty())

std::cout << "排序後:";

for(auto elem : new_vec)

std::cout << std::endl;

}//main

int main()

std::cout << std::endl;

smalltopheap heap;

heap.init(vec);

heap.print();

int elem = rand() % 100;

std::cout << "add elem:[" << elem << "]" << std::endl;

heap.add(elem);

heap.print();

int idx = rand() % siz;

std::cout << "dle idx:[" << idx << "]" << std::endl;

heap.del(idx);

heap.print();

heapsort(vec);

int a = -1.5;

std::cout << "a:" << a << endl; //-1

return 0;

}

排序演算法 堆排序(大頂堆 小頂堆)

堆排序的思想這裡就先不講了,以後有時間再補上,下面是分別採用大頂堆和小頂堆實現的堆排序。注意 下面例子中排序的數字是。大頂堆方式 include include using namespace std 堆調整 將nums s.m 調整為大頂堆,其中除了nums s 之外均滿足大頂堆的定義 void ...

大頂堆 小頂堆 堆排序

堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。大頂堆 k i k 2i 且k i k 2i 1。小頂堆 k i k 2i 且k i k 2i 1。堆序列可以理解成乙個完全二叉樹,該樹任意乙個結點的關鍵字的值都小於或等於它的孩子結點的關鍵字。例如 堆排序 若在輸出堆頂的最小值之後,使得...

Java 堆排序 大頂堆 小頂堆

引用 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序的平均時間複雜度為 nlogn 演算法步驟 1.建立乙個堆h 0.n 1 2.把堆首 最大值 和堆尾互換 3....