堆排序

 1 /* 堆和堆排序 */
 2 
 3 // 堆排序  查找最大值 最小值速度最快
 4 // 数据结构里面的堆  主要是取出极值
 5 
 6 #include<stdio.h>
 7 #include<stdlib.h>
 8 
 9 void show(int *p,int n)
10 {
11     
12     for(int i=0;i<n;i++)
13     {
14         printf("%4d",p[i]);    
15     }
16     printf("\n");
17 }
18 
19 void findmax(int *arr,int size)// 取最大值
20 {
21     for (int j=size-1;j>0;j--)// 堆排序  从尾部循环到头部,自下而上登顶
22     {
23         int parent = j / 2;// 父节点下标
24         int child = j;// 记录当前下标
25         if (j<size-1 && arr[j]<arr[j+1])// 先取出左右最大值
26         {
27             child++;
28         }
29 
30         if(arr[child]>arr[parent])// 最大值登顶
31         {
32             int temp = arr[child];
33             arr[child] = arr[parent];
34             arr[parent] = temp;
35         }
36     }
37 
38 }
39 
40 
41 void heapsort(int *arr,int size)// 堆排序   地址是固定的 需要额外交换数据
42 {
43     for (int j=size;j>0;j--)
44     {
45         findmax(arr,j);
46         int temp = arr[0];
47         arr[0] = arr[j-1];
48         arr[j-1] = temp;
49     }
50 }
51 
52 
53 
54 void heapsortbyaddr(int *arr,int size)// 地址  长度都在变化
55 {
56     for (int i=0;i<10;i++)
57     {
58         findmax(arr+i,size-i);
59         show(a,10);
60     }
61 }
62 
63 
64 void main()
65 {
66     int a[10]={10,13,20,12,30,14,50,19,60,29};
67 
68     
69     show(a,10);
70 
71     findmax(a,10);
72 
73     show(a,10);
74 
75     heapsort(a,10);
76 
77     show(a,10);
78 
79     system("pause");
80 }

 

posted on 2015-06-24 12:55  Dragon-wuxl  阅读(227)  评论(0)    收藏  举报

导航