1. 程式人生 > >堆排序算法

堆排序算法

wap main span 沒有 i++ space ++ bsp color

#include<iostream>
#include<algorithm>
using namespace std;
void MinHeapFixdown(int a[], int i, int n)//調整堆  
{  
    int j, temp;  
  
    temp = a[i];  
    j = 2 * i + 1;//i節點的左孩子節點  
    while (j < n)// 左孩子小於總數
    {  
        if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 右孩子節點小於左孩子  
j++; //此時j是右孩子 //沒有右孩子或者右孩子大於左孩子 最小的就是左孩子 if (a[j] >= temp) //最小的孩子節點大於父節點 就無需調整 break; a[i] = a[j]; //把較小的子結點往上移動,替換它的父結點 i = j;//i更新為孩子節點 j = 2 * i + 1; //j更新為新的i的左孩子節點 } a[i] = temp;//找到合適位置賦給a[i] } void MakeMinHeap(int
a[], int n)//初始化最小堆 { for (int i = n / 2 - 1; i >= 0; i--) MinHeapFixdown(a, i, n); } void MinheapsortTodescendarray(int a[], int n) { for (int i = n - 1; i >= 1; i--) { swap(a[i], a[0]); MinHeapFixdown(a, 0, i); } } int main() {
int a[100], n; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } MakeMinHeap(a, n); MinheapsortTodescendarray(a, n); for(i = 0; i < n; i++) cout<<a[i]<< ; return 0; }

堆排序算法