排序演算法__堆排序
排序演算法__堆排序
一、介紹
堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
二、C++實現
最大堆實現升序
#include<iostream>
#include<algorithm>
using namespace std;
//最大堆向下調整演算法
void down(int a[],int start,int end)
{
int c=start,tmp=a[c];//c表示當前元素,tmp表示要調整元素start的值
for(int l=2*c+1;l<=end;c=l,l=2*l+1)
{
if(l<end&&a[l]<a[l+1]) l++;//選擇左右孩子較大者
if(a[c]>=a[l]) break;//如果當前元素的值大於等於它的左右孩子,則退出(滿足最大堆的要求了)
//否則就讓它和它的孩子交換(值較大的一個孩子)
a[c]=a[l];
a[l]=tmp;
}
}
//堆排序,構建最大堆,升序排列
void heapSort(int a[],int n)
{
//先構建最大堆,n/2-1是最後一個有孩子的結點
for(int i=n/2-1;i>=0;i--) down(a,i,n-1);
for(int i=n-1;i>0;i--)
{
swap(a[0],a[i]);//將此時的最大值即a[0]和a[i]交換
down(a,0,i-1);//將元素a[0]向下調整,直至滿足最大堆的定義
}
}
int main()
{
int a[]={10,9,8,7,6,5,4,3,2,1};
int len=sizeof(a)/sizeof(a[0]);
printf("排序前:");
for(int i=0;i<len;i++)
printf("%d ",a[i]);
heapSort(a,len);
printf("\n排序後:");
for(int i=0;i<len;i++)
printf("%d ",a[i]);
return 0;
}
最小堆實現降序
#include<iostream>
#include<algorithm>
using namespace std;
void down(int a[],int start,int end)
{
int c=start,tmp=a[c];//c表示當前元素,tmp表示要調整元素start的值
for(int l=2*c+1;l<=end;c=l,l=2*l+1)
{
if(l<end&&a[l]>a[l+1]) l++;//選擇左右孩子較小者
//如果當前元素的值小於等於它的左右孩子,則退出(滿足最小堆的要求了)
if(a[c]<=a[l]) break;
//否則就讓它和它的孩子交換(值較小的一個孩子)
a[c]=a[l];
a[l]=tmp;
}
}
//堆排序,構建最小堆,降序排列
void heapSort(int a[],int n)
{
//先構建最小堆,n/2-1是最後一個有孩子的結點
for(int i=n/2-1;i>=0;i--) down(a,i,n-1);
for(int i=n-1;i>0;i--)
{
swap(a[0],a[i]);//將此時的最小值即a[0]和a[i]交換
down(a,0,i-1);//將元素a[0]向下調整,直至滿足最小堆的定義
}
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(a[0]);
printf("排序前:");
for(int i=0;i<len;i++)
printf("%d ",a[i]);
heapSort(a,len);
printf("\n排序後:");
for(int i=0;i<len;i++)
printf("%d ",a[i]);
return 0;
}
三、時間複雜度和穩定性
堆排序是不穩定的演算法。時間複雜度為
相關文章
- 排序演算法 - 堆排序排序演算法
- 排序演算法-堆排序排序演算法
- C#堆排序演算法C#排序演算法
- 圖解堆排序演算法圖解排序演算法
- 夯實基礎:排序演算法之堆排序排序演算法
- 看懂堆排序——堆與堆排序(三)排序
- 堆排序排序
- 演算法學習之選擇排序和堆排序:演算法排序
- python 堆排序Python排序
- js堆排序JS排序
- 【譯】Swift演算法俱樂部-堆排序Swift演算法排序
- 常見演算法 PHP 實現 -- 堆排序演算法PHP排序
- 資料結構與演算法:堆排序資料結構演算法排序
- 【資料結構與演算法】堆排序資料結構演算法排序
- 資料結構與演算法——堆排序資料結構演算法排序
- Python 一網打盡<排序演算法>之堆排序演算法中的樹Python排序演算法
- 堆排序 Heap Sort排序
- 堆排序詳解排序
- 堆排序(C++)排序C++
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 排序演算法:堆排序的實現和時間複雜度分析排序演算法時間複雜度
- js 實現堆排序JS排序
- 堆與堆排序(一)排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 堆排序和快速排序效能比較排序
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- 堆排序(實現c++)排序C++
- 堆排序c++實現排序C++
- 使用 Swift 實現堆排序Swift排序
- 順序表的堆排序排序
- 淺解前端必須掌握的演算法(五):堆排序(下)前端演算法排序
- 淺解前端必須掌握的演算法(五):堆排序(上)前端演算法排序
- 堆排序就這麼簡單排序
- 二叉堆及堆排序排序
- HDU 1040 As Easy As A+B(堆排序)排序
- 優先佇列和堆排序佇列排序
- 堆的基本操作及堆排序排序
- rust-algorithms:8-堆排序RustGo排序