堆排序實際上是利用了完全二叉樹的公式化描述特性,將乙個陣列以最大堆的方式呈現,並逐一刪除其根節點。
幾個概念要理解:
假設完全二叉樹中一元素的序號為i,1 <= i <= n,則以下關係成立:
1. 當i=1時,該元素為二叉樹的根。若i>1,則該元素父節點的編號為i/2(int取整);
2. 當2i>n時,該元素無左孩子,否則,其左孩子的編號為2i;
3. 當2i+1>n時,該元素無右孩子 ,否則,其右孩子的編號為2i+1。
最大樹:每個節點的值都大於或等於其子節點值的樹。
最大堆:完全二叉樹 && 最大樹。
maxheap.c:
#include #include #include #define ret_true 0
#define ret_false -1
struct maxheap ;
static struct maxheap * maxheap_init(int size);
static void maxheap_destroy(struct maxheap **heap);
static int maxheap_insert(struct maxheap *heap, int ele);
static int maxheap_delete_max(struct maxheap *heap, int *ret_ele);
static void swap_int(int *a, int *b)
static struct maxheap * maxheap_init(int size)
memset(heap->data, 0, size * sizeof(int));
heap->total_size = size;
heap->cur_size = 0;
return heap;
}static void maxheap_destroy(struct maxheap **heap)
free(m_heap);
m_heap = null; }}
static int maxheap_insert(struct maxheap *heap, int ele)
} return ret_true;
}static int maxheap_delete_max(struct maxheap *heap, int *ret_ele)
else if(heap->data[right_i-1] > heap->data[i-1]
&& heap->data[right_i-1] > heap->data[left_i-1])
} else
i++;
left_i = 2*i; /* 根據完全二叉樹的特性尋找左/右子節點 */
right_i = 2*i+1;
} return ret_true;
}static void print_max_heap(struct maxheap *heap)
}int main()
printf("\n");
return 0;
}
最大堆實現堆排序
堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...
最大堆排序 C
堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...
C 堆排序 建立最大堆類實現堆排序
class maxheap 建立新陣列 int temp newint newlength 複製 for int index 1 index oldlength index delete old old temp public maxheap int capacity 10 插入元素 void pu...