首页 > 代码库 > 堆排序(代码2)
堆排序(代码2)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void build_heap(int data[], int); 5 void adjust_heap(int data[], int); 6 void heap_sort(int data[], int); 7 int sub_max_heap(int data[], int, int); 8 9 int main(int argc, char *argv[]) 10 { 11 int i; 12 int data[12] = {6, 10, 3, 5, 12, 8, 4, 23, 1, 2, 9, 7 }; 13 14 heap_sort(data, 12); 15 16 for (i = 0; i < 12; ++i) 17 { 18 printf("%d ", data[i]); 19 } 20 21 printf("\n"); 22 return 0; 23 } 24 25 void heap_sort(int data[], int num) 26 { 27 int i = 1; 28 build_heap(data, num); 29 30 for (i = 1; i < num; ++i) 31 { 32 int temp; 33 temp = data[0]; 34 data[0] = data[num - i]; 35 data[num - i] = temp; 36 37 adjust_heap(data, num - i); 38 } 39 40 } 41 42 43 void build_heap(int data[], int num) 44 { 45 int i, k, p; 46 47 for (i = num / 2 - 1; i >= 0; --i) 48 { 49 k = sub_max_heap(data, num, i); 50 if (k == i) 51 continue; 52 53 while (2 * k + 1 < num) 54 { 55 p = k; 56 k = sub_max_heap(data, num, p); 57 if (k == p) 58 break; 59 } 60 } 61 62 } 63 64 65 void adjust_heap(int data[], int num) 66 { 67 int temp; 68 int k, p; 69 70 k = 0; 71 while(2 * k + 1 < num) 72 { 73 p = k; 74 k = sub_max_heap(data, num, p); 75 if (k == p) 76 break; 77 } 78 79 80 } 81 /* 82 int sub_max_heap(int data[], int num, int i) 83 { 84 int k; 85 86 if (2 * i + 2 <= num - 1 && data[2 * i + 1] > data[2 * i + 2]) 87 k = 2 * i + 1; 88 else if (2 * i + 2 <= num - 1) 89 k = 2 * i + 2; 90 else 91 k = 2 * i + 1; 92 93 if (data[k] > data[i]) 94 { 95 int temp; 96 temp = data[k]; 97 data[k] = data[i]; 98 data[i] = temp; 99 }100 101 return k;102 103 }104 */105 106 int sub_max_heap(int data[], int num, int i)107 {108 int largest;109 int l, r;110 111 l = 2 * i + 1;112 r = 2 * i + 2;113 114 if (l <= num - 1 && data[l] > data[i])115 largest = l;116 else117 largest = i;118 119 if (r <= num - 1 && data[r] > data[largest])120 largest = r;121 if (largest != i)122 {123 int temp;124 temp = data[i];125 data[i] = data[largest];126 data[largest] = temp;127 }128 129 return largest;130 }
堆排序(代码2)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。