1. 程式人生 > >c++堆排序實現

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個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法