数据结构_堆排序

        

 最近一段时间,是比较闲,但是冬天了,好冷,所以一直没有更新博客,后面要发扬不怕苦的精神。又买了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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值