數據結構與算法-學習筆記(11)-堆排序

菜鳥一枚,
剛剛學習數據結構與算法,
爲了加深理解,
所以與同學們分享學習過程。

今天學習的是,
堆排序!!!

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上代碼:

#include <stdio.h>
#include <stdlib.h>

void swap1(int arr[],int i,int j)
{
    int temp;
    temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}


void heapify(int tree[],int n,int i)   //使其符合parent>c1,c2
{
    int c1 = 2 * i + 1;
    int c2 = 2 * i + 2;
    int max = i;
    if(i >= n)
    {
        return;
    }
    if(c1 < n && tree[c1] > tree[max])
    {
        max = c1;
    }
    if(c2 < n && tree[c2] > tree[max])
    {
        max = c2;
    }
    if(max != i)
    {
        swap1(tree,max,i);
        heapify(tree,n,max);
    }
}


void build_heap(int tree[],int n)   //建堆
{
    int last_node = n - 1;
    int parent = (last_node - 1) / 2;
    int i;
    for(i = parent; i >= 0;i--)
    {
        heapify(tree,n,i);
    }
}

void heap_sort(int tree[],int n)  //堆排序
{

    build_heap(tree,n);
    int i;
    for(i=n-1;i >= 0;i--)
    {
        swap1(tree,i,0);
        heapify(tree,i,0);
    }
}

int main()
{
    int tree[]={2,5,3,1,10,4};
    int n = 6;
    int i;
    heap_sort(tree,n);
    //heapify(tree,n,0); //對這個雜亂數組,變成堆
    for( i = 0;i < n;i++)
    {
        printf("%d ",tree[i]);
    }
    return 0;
}

謝謝同學們的閱讀!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章