最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++堆排序算法實(shí)例詳解

 更新時(shí)間:2017年08月15日 11:14:00   作者:葉赫那拉坤  
這篇文章主要介紹了C++堆排序算法,簡(jiǎn)單分析了堆排序算法的原理并結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下

本文實(shí)例講述了C++堆排序算法。分享給大家供大家參考,具體如下:

堆中元素的排列方式分為兩種:max-heap或min-heap,前者每個(gè)節(jié)點(diǎn)的key都大于等于孩子節(jié)點(diǎn)的key,后者每個(gè)節(jié)點(diǎn)的key都小于等于孩子節(jié)點(diǎn)的key。

由于堆可以看成一個(gè)完全二叉樹(shù),可以使用連續(xù)空間的array來(lái)模擬完全二叉樹(shù),簡(jiǎn)單原始的實(shí)現(xiàn)如下:

#include<iostream>
int heapsize=0;//全局變量記錄堆的大小
void heapSort(int array[],int n){
 void buildHeap(int [],int);
 void exchange(int[],int,int);
 void heapify(int[],int);
 buildHeap(array,n);
 for(int i=n-1;i>=1;i--){
  exchange(array,0,i);
  heapsize--;
  heapify(array,0);
 }
}
//構(gòu)建堆
void buildHeap(int array[],int n){
 void heapify(int[],int);
 heapsize=n;
 //從最小的父節(jié)點(diǎn)開(kāi)始,進(jìn)行堆化,直到樹(shù)根節(jié)點(diǎn)
 for(int i=heapsize/2-1;i>=0;i--){
  heapify(array,i);
 }
}
//堆化
void heapify(int array[],int n){
 void exchange(int[],int,int);
 int left_child=n*2+1;
 int right_child=n*2+2;
 int largest;
 if(left_child<heapsize&&array[left_child]>array[n]){
  largest = left_child;
 }
 else{
  largest = n;
 }
 if(right_child<heapsize&&array[right_child]>array[largest]){
  largest=right_child;
 }
 if(largest!=n){
  exchange(array,largest,n);
  heapify(array,largest);
 }
}
void exchange(int array[],int i,int j){
 int tmp = array[i];
 array[i]=array[j];
 array[j]=tmp;
}
int main(){
  int arr[9]={3,1,6,9,8,2,4,7,5};
  heapSort(arr,9);
  for(int i=0;i<9;++i){
    std::cout<<arr[i]<<" ";
  }
  std::cout<<std::endl;
  return 0;
}
STL中實(shí)現(xiàn)了max-heap的操作。在使用heap算法是需添加頭文件algorithm。
#include <iostream>
#include<vector>
#include<algorithm>
int main()
{
  int arr[9]={0,1,2,3,4,8,9,3,5};
  std::vector<int> vec(arr,arr+9);
  //0 1 2 3 4 8 9 3 5
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  make_heap(vec.begin(),vec.end());
  //9 5 8 3 4 0 2 3 1
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  vec.push_back(7);
  push_heap(vec.begin(),vec.end());
  //9 7 8 3 5 0 2 3 1 4
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  pop_heap(vec.begin(),vec.end());
  //8 7 4 3 5 0 2 3 1 9,只是將最大值挪到了vector的最后,并沒(méi)有刪除
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  std::cout<<vec.back()<<std::endl;//9
  //將9刪除
  vec.pop_back();
  //連續(xù)的pop_heap操作,每次的最大值都放在最尾端,最后呈現(xiàn)遞增排序
  sort_heap(vec.begin(),vec.end());
  //0 1 2 3 3 4 5 7 8
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  return 0;
}

希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 淺談 C++17 里的 Visitor 模式

    淺談 C++17 里的 Visitor 模式

    Visitor模式經(jīng)常用于將更新的設(shè)計(jì)封裝在一個(gè)類中,并且由待更改的類提供一個(gè)接受接口,其關(guān)鍵技術(shù)在于雙分派技術(shù),本文主要介紹 C++17 里的 Visitor 模式的相關(guān)資料,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++之異常處理詳解

    C++之異常處理詳解

    C++中處理異常的過(guò)程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個(gè)錯(cuò)誤信息,把它傳遞給上一級(jí)的函數(shù)來(lái)解決,上一級(jí)解決不了,再傳給其上一級(jí),由其上一級(jí)處理
    2013-08-08
  • 淺析c++函數(shù)參數(shù)和返回值

    淺析c++函數(shù)參數(shù)和返回值

    c++一直以來(lái)是一個(gè)關(guān)注效率的代碼,這樣關(guān)于函數(shù)的參數(shù)傳遞和返回值的接收,是重中之重,這篇文章主要介紹了c++函數(shù)參數(shù)和返回值,需要的朋友可以參考下
    2023-05-05
  • C語(yǔ)言實(shí)現(xiàn)按行讀寫(xiě)文件

    C語(yǔ)言實(shí)現(xiàn)按行讀寫(xiě)文件

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)按行讀寫(xiě)文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表

    如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表

    本篇文章是對(duì)用C++實(shí)現(xiàn)雙向循環(huán)鏈表的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法

    超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法

    歸并排序是比較穩(wěn)定的排序方法。它的基本思想是把待排序的元素分解成兩個(gè)規(guī)模大致相等的子序列。本文將用C++實(shí)現(xiàn)這一排序算法,需要的可以參考一下
    2022-09-09
  • C++ 成員變量的初始化順序問(wèn)題詳解

    C++ 成員變量的初始化順序問(wèn)題詳解

    這篇文章主要介紹了C++ 成員變量的初始化順序問(wèn)題詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • cmake跨平臺(tái)構(gòu)建工具的學(xué)習(xí)筆記

    cmake跨平臺(tái)構(gòu)建工具的學(xué)習(xí)筆記

    CMake是一個(gè)跨平臺(tái)的安裝/編譯工具,通過(guò)CMake我們可以通過(guò)簡(jiǎn)單的語(yǔ)句來(lái)描述所有平臺(tái)的安裝/編譯過(guò)程,下面這篇文章主要給大家介紹了關(guān)于cmake跨平臺(tái)構(gòu)建工具的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Qt服務(wù)應(yīng)用操作之JSON文件操作方法

    Qt服務(wù)應(yīng)用操作之JSON文件操作方法

    在Qt框架中,處理JSON數(shù)據(jù)包括解析、生成、保存和讀取文件等操作,本文詳細(xì)介紹了這些操作的關(guān)鍵類和方法,如QJsonDocument、QJsonObject、QJsonArray等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • C++?Boost?Assign超詳細(xì)講解

    C++?Boost?Assign超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-12-12

最新評(píng)論

蒙自县| 康乐县| 鹰潭市| 山西省| 朝阳区| 四平市| 黑龙江省| 武隆县| 濮阳市| 石景山区| 溧水县| 斗六市| 平顶山市| 九江县| 东宁县| 太仓市| 隆昌县| 武川县| 自治县| 刚察县| 兴业县| 松溪县| 永丰县| 旬邑县| 饶阳县| 广丰县| 崇文区| 灯塔市| 云林县| 隆尧县| 玉田县| 富阳市| 赤壁市| 汝南县| 定陶县| 钦州市| 汉川市| 永城市| 那坡县| 清徐县| 渝北区|