排序演算法__堆排序
排序演算法__堆排序
一、介紹
堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
二、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;
}
三、時間複雜度和穩定性
堆排序是不穩定的演算法。時間複雜度為
相關文章
- 排序演算法-堆排序排序演算法
- 排序演算法 - 堆排序排序演算法
- 堆排序演算法排序演算法
- #排序演算法#【3】堆排序排序演算法
- 排序演算法總結之堆排序排序演算法
- 圖解堆排序演算法圖解排序演算法
- C#堆排序演算法C#排序演算法
- 演算法導論-堆排序演算法排序
- 【譯】Swift演算法俱樂部-堆排序Swift演算法排序
- 看懂堆排序——堆與堆排序(三)排序
- 夯實基礎:排序演算法之堆排序排序演算法
- 堆排序排序
- 演算法學習之選擇排序和堆排序:演算法排序
- js堆排序JS排序
- [JAVA]堆排序Java排序
- 複習資料結構:排序演算法(六)——堆排序資料結構排序演算法
- 《排序演算法》——堆排序(大頂堆,小頂堆,Java)排序演算法Java
- 資料結構與演算法——堆排序資料結構演算法排序
- 【資料結構與演算法】堆排序資料結構演算法排序
- 常見演算法 PHP 實現 -- 堆排序演算法PHP排序
- 資料結構與演算法:堆排序資料結構演算法排序
- Java實現HEAPSORT堆排序演算法Java排序演算法
- 資料結構&演算法實踐—堆排序資料結構演算法排序
- 堆排序詳解排序
- python 堆排序Python排序
- 堆排序 Heap Sort排序
- 堆排序(C++)排序C++
- HeapSort 堆排序排序
- 【筆記】堆排序筆記排序
- 實現堆排序排序
- 簡單堆排序排序
- Python 一網打盡<排序演算法>之堆排序演算法中的樹Python排序演算法
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 演算法導論_第六章_堆排序演算法排序
- 排序演算法:堆排序的實現和時間複雜度分析排序演算法時間複雜度
- js 實現堆排序JS排序
- 堆與堆排序(一)排序
- 堆排序(php實現)排序PHP