排序算法之(7)——堆排序

【堆排序的思路】

堆排序主要是利用了堆的性質。對于大頂堆:堆中的每一個節點的值都不小于它的孩子節點的值,具體可參考我的還有一篇博客http://blog.csdn.net/adminabcd/article/details/46880591,那么大頂堆的堆頂元素就是當前堆中全部元素中最大的。


利用這個性質。進行例如以下操作,則能夠得到一個有序序列:

  1. 將待排序的n個元素一個一個插入堆中,那么此時堆頂元素就是全部元素中最大的
  2. 將堆頂元素取出,剩下的n-1個元素組成新的堆,新堆的堆頂元素是當前堆中元素中最大的,也就是全部元素中第二大的。

  3. 將堆頂元素取出。剩下的n-2個元素組成新的堆,新堆的堆頂元素是當前堆中元素中最大的。也就是全部元素中第三大的。
    .
    .
    .
    .

  4. 直到全部元素取出,此時全部取出元素序列就是一個從大到小的有序序列。

【代碼實現】

  1. 大頂堆的實現
#ifndef maxheap_h
#define maxheap_h
template<class T>
class Maxheap
{
public:Maxheap(int size);~Maxheap();bool Isempty();void push(T item);  //插入操作void pop();  //刪除操作T top();
private:T *heap;int currentSize;int capacity;
};
//-------構造函數初始化-------
template<class T>
Maxheap<T>::Maxheap(int size)
{if(size<1){throw"capacity must be >=1";}else{currentSize=0;capacity=size;heap=new T[capacity+1]; //heap[0]不使用}
}
//-------析構函數釋放空間-------
template<class T>
Maxheap<T>::~Maxheap()
{delete []heap;
}
//--------推斷堆是否為空-------
template<class T>
bool Maxheap<T>::Isempty()
{return currentSize==0;
}
//---------獲取最大元素----------
template<class T>
T Maxheap<T>::top()
{return heap[1];
}
//-------插入操作-----
template<class T>
void Maxheap<T>::push(T item)
{if(currentSize==capacity)throw"Maxheap is full";else{currentSize++;int currentNode=currentSize;// 元素的插入位置初始化為最后while(currentNode>1&&heap[currentNode/2]<item)  //(從下往上)進行調整{heap[currentNode]=heap[currentNode/2];currentNode=currentNode/2;}heap[currentNode]=item; //插入元素}
}//-----刪除操作-------
template<class T>
void Maxheap<T>::pop()
{if(Isempty())throw"heap is empty ,cannot delete";else{T last=heap[currentSize];  //將最后一個元素初始化為根currentSize--;int currentNode=1;       int child=2;while(child<=currentSize)  //(從上往下)進行調整{if(child<currentSize&&heap[child]<heap[child+1])child++;if(last>=heap[child])break;else{heap[currentNode]=heap[child];currentNode=child;child=child*2;}}heap[ currentNode]=last; }
}
#endif
  1. 堆排序實現
#include"MAXHEAP.h"
#include<iostream>
using namespace std;
int main()
{Maxheap<int> H(100);int arr[]={50,15,30,70,6};for(int i=0;i<5;i++){H.push(arr[i]); //元素進堆}for(int i=0;i<5;i++){arr[i]= H.top();H.pop();  //取出堆頂元素。其余元素組成新的堆}cout<<"降序排序:";for(int i=0;i<5;i++){cout<<arr[i]<<" ";}cout<<endl;cout<<"升序排序:";for(int i=4;i>=0;i--){cout<<arr[i]<<" ";}cout<<endl;system("pause");return 0;
}

【結果】
這里寫圖片描寫敘述

轉載于:https://www.cnblogs.com/claireyuancy/p/7131905.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML基礎:基本標簽簡介(3)

html中有很多標簽&#xff0c;下面介紹最基本的幾個標簽。 1、meta 是head標簽中的一個輔助性標簽。 有2個重要屬性&#xff1a; &#xff08;1&#xff09;name 可以優化頁面被搜索到的可能性。name中可以指定屬性&#xff0c;content是屬性值。 <html><head><…

java 字符碼_Java字符編碼

編碼原理介紹(中文編碼雜談)&#xff1a;int -> byte可以直接使用強制類型轉換: byte b (byte) aInt;這個操作是直接截取int中最低一個字節&#xff0c;如果int大于255&#xff0c;則值就會變得面目全非了byte -> int這里有兩種情況&#xff0c;一種是要求保持值不變&am…

重新登錄:重新登錄

嗨&#xff0c;我再次回到日志中來&#xff0c;這是任何應用程序設計和開發的固有部分。 我是堅強的基礎知識的忠實擁護者&#xff0c;在我的拙見中&#xff0c;日志記錄是任何企業級應用程序中經常被忽略但基本的關鍵要素之一。 我已經寫在此之前這里 。 為了理解當前文章&…

eclipse 下使用git clone

方法一&#xff1a;eclipse安裝好git插件后&#xff0c;直接import-git-project from git- clone url-輸入github的網址等就可以了方法二&#xff1a;使用git軟件&#xff0c;到指定的目錄&#xff0c;右擊git bash here&#xff0c;git clone 加帶有網址的文件.git,如&#xf…

linux -unrar解壓縮

解壓縮命令unrar的使用&#xff1a; $unrar --help用法: unrar <command>-<switch 1> -<switchN> <archive><files...><listfiles...><path_to_extract\><命令>e 解壓文件到當前目錄l[t,b] 列出壓縮文檔信…

終極JPA查詢和技巧列表–第3部分

在閱讀第三部分之前&#xff0c;請記住本系列的第一部分和第二部分 JPA&#xff1a;通過查詢創建對象 JPA允許我們在查詢內創建對象&#xff0c;并帶有所需的值&#xff1a; package com.model;public class PersonDogAmountReport {private int dogAmount;private Person pe…

分治1--二分查找

分治1--二分查找 一、心得 二、題目和分析 三、代碼和結果 1 #include <iostream>2 using namespace std;3 int a[10]{1,2,4,5,7,8,9,10,13,20};4 5 6 //非遞歸 7 int find(int i){8 int l0,r9;9 int mid(lr)/2; 10 while(l<r){ 11 mid(lr)/2; 12…

隱式意圖啟動一個Activity

隱式意圖是通過指定一組動作或者屬性實現&#xff0c;主要用于跨應用使用。 1.創建一個意圖對象 Intent intent new Intent();2.設置意圖過濾器 intent.setAction("android.intent.action.testActivity"); //對應于action intent.addCategory("android.intent.…

Spring自定義命名空間

Spring自定義命名空間提供了一種很好的方式來簡化用于描述Spring應用程序上下文的bean定義的xml文件。 這是一個相當古老的概念&#xff0c;最初是在Spring 2.0中引入的&#xff0c;但值得不時地進行審查。 考慮一種情況&#xff0c;必須為沒有自定義名稱空間的Spring MVC應用程…

java二叉樹代碼_JAVA語言實現二叉樹生成的代碼教程

本文主要向大家介紹了JAVA語言實現二叉樹生成的代碼教程&#xff0c;通過具體的內容向大家展示&#xff0c;希望對大家學習JAVA語言有所幫助。給定某二叉樹三序遍歷中的兩個&#xff0c;我們即可以通過生成該二叉樹&#xff0c;并遍歷的方法&#xff0c;求出剩下的一序&#xf…

一個回到頂部的錨點

一般網站的右下角都會有一個回到頂部的錨點&#xff0c;但是在沒有學bootstrap的時候&#xff0c;我還是會想著用定位來做這個東西&#xff0c;但是現在用bootstrap來做的&#xff0c;所以將它記錄下來。 <!DOCTYPE html><html> <head><title>附加導航…

jquery jgrid filterToolBar beforeSearch 修改postData

beforeSearch: function() { var posted_data $("#mygrid").jqGrid(getGridParam,postData); posted_data ["testp"]"helloTest"; }轉載于:https://www.cnblogs.com/qiumingcheng/p/7141671.html

預告片:裸指關節SOA

我正在研究這個想法&#xff0c;但我不知道它是否對你們有吸引力。 我想就您是否需要進一步探討提出您的意見。 達成協議&#xff1a;我遇到過一些團隊&#xff0c;他們在使用SOA技術時由于其工具的復雜性而陷入泥潭。 我只在Java中看到過這種情況&#xff0c;但是我從一些C&am…

網頁轉圖片 java_java-網頁轉圖片

對比了網上常用的好幾種網頁轉圖片的開源插件&#xff0c;最后效果還不如使用原生的java直接寫來得好&#xff0c;上代碼&#xff0c;很簡單&#xff0c;中間需要考慮網頁加載延遲的問題&#xff0c;所以需要加上thread.sleep&#xff0c;休眠一下等待網頁加載完成了&#xff0…

開一個新坑吧

每天讀讀日志 給自己動力 開個新坑&#xff08;外星殖民&#xff09; 無聊時寫一寫 轉載于:https://www.cnblogs.com/dandansang/p/7143489.html

JMX和Spring –第1部分

這是三篇文章的第一篇&#xff0c;這三篇文章將展示如何通過JMX支持為Spring應用程序賦能。 Maven配置 這是用于設置此示例代碼的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSche…

maven exclude java_java – Maven:從shade插件中排除依賴項

我在mvn clean install之后看過下一個字符串Including com.sun.jersey.contribs:jersey-multipart:jar:1.5 in theshaded jar問題&#xff1a;即使我已經為maven-shade-plugin添加了exlusion,我也無法使它沒有陰影(參見下面的代碼)我的maven-shade-plugin&#xff1a;org.apach…

JMX和Spring –第3部分

本文是本系列的最后一篇。 看一下第1 部分和第2部分 。 在本系列的最后一篇文章中&#xff0c;我將展示如何在JDK中使用本機JMX支持來實現一種通知機制&#xff0c;該機制可以在HEAP內存超過特定閾值時向偵聽器發出警報。 正如我在上一篇文章中討論的那樣&#xff0c;這種方法…

QScrollArea不能顯示滾動條

轉載請注明出處&#xff1a;http://www.cnblogs.com/dachen408/p/7147141.html 問題&#xff1a;QScrollArea不能顯示滾動條 解決方案&#xff1a;設置QScrollArea->setWidgetResizeable&#xff08;false&#xff09;解決問題。 例子&#xff1a; ui.scrollArea->setWi…

java婚慶網站源碼_基于jsp的婚慶網站-JavaEE實現婚慶網站 - java項目源碼

基于jspservletpojomysql實現一個javaee/javaweb的婚慶網站, 該項目可用各類java課程設計大作業中, 婚慶網站的系統架構分為前后臺兩部分, 最終實現在線上進行婚慶網站各項功能,實現了諸如用戶管理, 登錄注冊, 權限管理等功能, 并實現對各類婚慶網站相關的實體進行管理。該婚慶…