堆排序
2013-04-07 00:00
176 查看
1 #include <stdio.h>
2 #include <string.h>
3 #include <math.h>
4
5 const int HEAP_SIZE = 13;
6
7 int parent(int i)
8 {
9 if (0 == i)
10 return 0;
11
12 return (int)(floor(i - 1)/2);
13 }
14
15 int left(int i)
16 {
17 return (2*i + 1);
18 }
19
20 int right(int i)
21 {
22 return (2*i + 2);
23 }
24
25 void Max_Heapify(int list[], int i, int heap_size)
26 {
27 int l = left(i);
28 int r = right(i);
29 int largest = -1;
30
31 if (l < heap_size)
32 {
33 if (list[i] > list[l])
34 largest = i;
35 else
36 largest = l;
37 }
38
39 if (r < heap_size)
40 {
41 if (list[largest] < list[r])
42 largest = r;
43 }
44
45 if (largest != -1 && largest != i)
46 {
47 int tmp = list[i];
48 list[i] = list[largest];
49 list[largest] = tmp;
50 Max_Heapify(list,largest,heap_size);
51 }
52 }
53
54 void Build_Max_Heap(int list[])
55 {
56 int i;
57 for(i = (HEAP_SIZE-2)/2; i >= 0; i--)
58 Max_Heapify(list,i,HEAP_SIZE);
59 }
60
61 void print(int list[])
62 {
63 int i;
64 for(i = 0; i < HEAP_SIZE; i++)
65 printf("%d ",list[i]);
66 printf("\n");
67 }
68
69 void HeapSort(int list[], int heap_size)
70 {
71 Build_Max_Heap(list);
72 int i;
73 for(i = heap_size - 1; i >=0; i--)
74 {
75 int tmp = list[i];
76 list[i] = list[0];
77 list[0] = tmp;
78 Max_Heapify(list,0,i);
79 }
80 }
81
82
83 int main()
84 {
85 int list[] = {5,7,9,8,4,100,1,0,6,4,6,19,3};
86 HeapSort(list,HEAP_SIZE);
87 print(list);
88 return 0;
89 }
build:
gcc -o heapsort heapsort.c -lm
run:
time ./heapsort
result:
0 1 3 4 4 5 6 6 7 8 9 19 100
real 0m0.002s
user 0m0.000s
sys 0m0.002s
2 #include <string.h>
3 #include <math.h>
4
5 const int HEAP_SIZE = 13;
6
7 int parent(int i)
8 {
9 if (0 == i)
10 return 0;
11
12 return (int)(floor(i - 1)/2);
13 }
14
15 int left(int i)
16 {
17 return (2*i + 1);
18 }
19
20 int right(int i)
21 {
22 return (2*i + 2);
23 }
24
25 void Max_Heapify(int list[], int i, int heap_size)
26 {
27 int l = left(i);
28 int r = right(i);
29 int largest = -1;
30
31 if (l < heap_size)
32 {
33 if (list[i] > list[l])
34 largest = i;
35 else
36 largest = l;
37 }
38
39 if (r < heap_size)
40 {
41 if (list[largest] < list[r])
42 largest = r;
43 }
44
45 if (largest != -1 && largest != i)
46 {
47 int tmp = list[i];
48 list[i] = list[largest];
49 list[largest] = tmp;
50 Max_Heapify(list,largest,heap_size);
51 }
52 }
53
54 void Build_Max_Heap(int list[])
55 {
56 int i;
57 for(i = (HEAP_SIZE-2)/2; i >= 0; i--)
58 Max_Heapify(list,i,HEAP_SIZE);
59 }
60
61 void print(int list[])
62 {
63 int i;
64 for(i = 0; i < HEAP_SIZE; i++)
65 printf("%d ",list[i]);
66 printf("\n");
67 }
68
69 void HeapSort(int list[], int heap_size)
70 {
71 Build_Max_Heap(list);
72 int i;
73 for(i = heap_size - 1; i >=0; i--)
74 {
75 int tmp = list[i];
76 list[i] = list[0];
77 list[0] = tmp;
78 Max_Heapify(list,0,i);
79 }
80 }
81
82
83 int main()
84 {
85 int list[] = {5,7,9,8,4,100,1,0,6,4,6,19,3};
86 HeapSort(list,HEAP_SIZE);
87 print(list);
88 return 0;
89 }
build:
gcc -o heapsort heapsort.c -lm
run:
time ./heapsort
result:
0 1 3 4 4 5 6 6 7 8 9 19 100
real 0m0.002s
user 0m0.000s
sys 0m0.002s