最近一段时间,是比较闲,但是冬天了,好冷,所以一直没有更新博客,后面要发扬不怕苦的精神。又买了200块的书,有得看了,趁现在不忙的时候,将数据结构相关的基础打好。
一直在看几种排序,从今天开始的一段时间,将排序相关整理到博客上。
/*堆排序,借助完全二叉树,来排序,规我们用最大堆来排序,
最大堆规定父亲结点的值大于等于子结点
,根据二叉树性质,父亲结点的值的下标为i,那么子结点的值为2i和2i+1;
1,首先使这颗二叉树满足,最大堆的性质。递归调用i/2 一直到0.
2,由于已经满足最大堆的性质,我们现在就可以知道根结点在最上面
,也就是最大值在最上面。再来就递归调用,先将根结点换到最后的一个值,
将最后的一个值,放到根结点。再递归调用的时候,就可以依次移动,进行排序。
*/
/*二叉堆数据结构是一种数据对象,它可以被视为一颗完全二叉树,树中的每个结点与数组中存放该结点值的那个元素对应
PATENT(i)
return i/2
LEFT(i)
return 2i
RIGHT(i)
return 2i+1
二叉堆分两种,分别为最小堆和最大堆,在最大堆中,除了根结点外,
每个结点iA[PARENT(i)] >= A[i]最小堆A[PARENT[i]] <= A[i]我们在堆排序算法中,
采用最大堆,最小堆一般使用在构造优先队列时使用
*/
/*保持堆的性质,这里为最大堆保持最大堆伪代码
MAX-HEAPIFY(A,i)1
l <- LEFT(i)
2 r <- RIGHT(i)
3 if l <= heap-size[A] and A[l] > A[i]
4 then largest <- l
5 else largest <- i
6 if r <= heap-size[A] and A[r] > A[largest]
7 then largest <- r
8 if largest != i
9 then exchange A[i] <-> A[largest]
10 MAX-HEAPIFY(A,largest)*/
/*建堆的伪代码BUILD-MAX-HEAP(A)
1 heap-size[A] <- length[A]
2 for i <- length[A] / 2 downto 1
3 do MAX-HEAPIFY(A,i)
*/
/*由于我是按照算法导论这本书来的,但是由于这本书里面,都是将下标从1开始,我基本都将其修改为0,所以跟算法导论里面有些不一样。*/
#define array_length 100
static unsigned int heap_length = 0;
int max_heapify(int a[],int i){
int l = 0,r = 0,largest = 0,itemp = 0;
l = 2*i + 1;
r = 2*i + 2;
if((l <= heap_length) && (a[l] > a[i])){
largest = l;
}else{
largest = i;
}
if((r <= heap_length) && (a[r] > a[largest])){
largest = r;
}
if(largest != i){
itemp = a[largest];
a[largest] = a[i];
a[i] = itemp;
}
return 0;
}
int build_max_heap(int a[]){
int i = 0;
for( i = (array_length - 1) /2; i >= 0; i--){
max_heapify(a,i);
}
return 0;
}
int main(int argc, char* argv[]){
int a[array_length];
int icycle = 0,itemp = 0;
printf("dui paixu before:\n");
for(icycle = 0; icycle < array_length;icycle++){
a[icycle] = rand() + icycle + icycle / (1 + icycle/5);
printf("%d ",a[icycle]);
}
printf("\n");
heap_length = array_length-1;
build_max_heap(a);
for(int i = array_length-1; i > 0; i--){
itemp = a[0];
a[0] = a[i];
a[i] = itemp;
heap_length--;
build_max_heap(a);
}
printf("dui paixu after:\n");
for(icycle = 0; icycle < array_length;icycle++){
printf("%d ",a[icycle]);
}
return 0;
}