c++堆排序實現
堆排序的時間複雜度是O(nlgn)
#include<iostream>
using namespace std;
int arrs[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 };
int arrLen = sizeof(arrs) / sizeof(arrs[0]);
//維護堆的性質,保證除了根節點以外的所有節點i滿足A[PARENT(i)]>=A[i]
void adjustHeap(int* arrs, int p, int len)
{
int rchild = 2 * p + 1;//左孩子
int lchild = 2 * p;
int largest = p;
if (lchild<len && arrs[lchild]>arrs[p])
largest = lchild;
if (rchild<len && arrs[rchild]>arrs[largest])
largest = rchild;
if (largest != p)
{
swap(arrs[p], arrs[largest]);
adjustHeap(arrs, largest, len);
}
}
//建堆
void buildHeap(int* arrs, int len)
{
for (int i = len / 2 - 1; i >= 0; i--)
adjustHeap(arrs, i, len);
}
//堆排序演算法
void sortHeap(int* arrs, int len)
{
buildHeap(arrs, arrLen);
for (int i = len - 1; i >= 0; i--)
{
swap(arrs[0], arrs[i]);
adjustHeap(arrs, 0, i);
}
}
int main()
{
sortHeap(arrs, arrLen);
for (int i = 0; i < arrLen; i++)
cout << arrs[i] << endl;
return 0;
}
相關推薦
c++堆排序實現(heapsort) (演算法導論)
利用最大堆實現。 最大堆:最大堆性質是除了根結點意外的所有結點 i 都要滿足A[parent[i]] >= A[i] 需要利用到的一個性質:當用陣列表示儲存n個元素的堆時,葉結點的下標分別是n/2, n/2+1, n/2 + 2, ......,n - 1. (下標
c++堆排序實現
堆排序的時間複雜度是O(nlgn) #include<iostream> using namespace std; int arrs[] = { 23, 65, 12, 3, 8, 76
C++ 堆排序演算法的實現與改進(含筆試面試題)
堆排序(Heap sort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以用到上一次
堆排序實現
操作 ora right 堆排 word -i 堆排序 margin space 1、堆排序算法描寫敘述: (1)定義 n個keyword序列Kl,K2,…,Kn稱為(Heap)。當且僅當該序列滿足例如以下性質(簡稱為堆性質): 1)ki<=
java堆排序實現
wap compare 之前 compareto string swap 代碼 範圍 最後一個元素 代碼如下: public class HeapSort { public static void heapSort(DataWrap[] data) {
c 堆排序
sdn oid 二叉 term 它的 pri roc src start #include <stdio.h> #include <stdlib.h> //堆調整,構建大頂堆,arr[]是待調整的數組,i是待調整的數組 //元素的位置,
最小的k個數1 堆排序實現
葉子節點 gpo 新建 void 堆排序實現 oid end 個數 時間 // 使用堆排序實現 其時間復雜度為O(nlgn) private static void buildMaxHeap(int[] input, int end) { // 從
c++ 堆排序 源代碼
arr pri using pac getchar getc -- void 所有 #include "stdafx.h" #include <iostream> using namespace std; template<typename T> v
C++選擇排序實現
#include <iostream> #include<string> using namespace std; void print(int a[], int n ,int i){ cout<<i <<":"; for(int j
python堆排序實現TOPK問題
# 構建小頂堆跳轉def sift(li, low, higt): tmp = li[low] i = low j = 2 * i + 1 while j <= higt: # 情況2:i已經是最後一層 if j + 1 <=
C#各排序實現方法
1 /// <summary> 2 /// 排序輔助類 3 /// </summary> 4 public static class SortExtention 5 { 6 /// <summary
【演算法導論】堆排序實現
我建立了一個Heap的資料結構,而不是像STL那樣使用函式解決堆排序,當然STL的比較優雅一點,我只是提供第二個思路 #ifndef HEAP_SORT_H #define HEAP_SORT_H #include <vector> #include <
堆排序(C語言實現)
names 博客 鏈接 c語言實現 建立 ron 要求 clas [1] 之前的博客介紹介紹了數組的兩種排序算法:插入排序和歸並排序(採用遞歸),見鏈接http://blog.csdn.net/u013165521/article/detai
堆排序 C++實現
logs pso int brush -- cpp end tac 排序 #include<iostream> #include<vector> #include<stack> #include<algorithm> #in
堆排序 (heap sort) C# 實現
main 函式中呼叫: var data = new int[] {5,7,6,4,1,9,3}; heapSort(data);
C語言堆排序(HeapSort)的思想和程式碼實現
C語言堆排序(HeapSort)的思想和程式碼實現 經過一晚上和有一早上的思考和學習,在Clion上反覆的單步除錯之後,我總結了關於堆排序這個演算法的一點體會。現在來記錄一下,如有錯誤,歡迎批評指出,謝謝! 首先:什麼是堆排序,為什麼叫堆? Heapsort是一種根據選擇排序的思想,利用
堆排序演算法詳解及實現-----------c語言
堆排序原理: 堆排序指的是將大堆(小堆)堆頂(即下標為0)元素與堆的最後一個(即下標為hp->size - 1)元素交換,hp->size–,將其餘的元素再次調整成大堆(小堆),再次將堆頂(即下標為0)元素與堆的最後一個(即下標為hp->s
堆排序法(Java & C/C++ 實現)
一、前言 堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 O(n * lg n)。 介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。 二、堆 1. 示意圖 2. 性質 除最底層外,該樹是完全充滿的,且是從左到右填充。 樹的根結點是 A[
C++理解並實現堆排序
摘要 作為選擇排序的改進版,堆排序可以把每一趟元素的比較結果儲存下來,以便我們在選擇最小/大元素時對已經比較過的元素做出相應的調整。 堆排序是一種樹形選擇排序,在排序過程中可以把元素看成是一顆完全二叉樹,每個節點都大(小)於它的兩個子節點,當每
C語言中常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序)實現比較
以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法