您的位置:首页 > 理论基础 > 数据结构算法

数据结构_堆排序

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: