堆排序

  堆排序过程:

  1:建立堆(大根堆或者小根堆)

      2:交换第一个和最后一个。

  3:堆调整。

  其实整个过程最核心的算法就是对调整:

复制代码
 1 #include <stdio.h>
 2 
 3 //交换
 4 static void swap(void *a[], int i, int j){
 5     void *tmp;
 6     tmp  = a[i];
 7     a[i] = a[j];
 8     a[j] = tmp;
 9 }
10 
11 //堆调整
12 static void heapify(void **ar, int(*cmp)(const void *, const void *), int idx, int max){
13     int left  = 2 * idx + 1;
14     int right = 2 * idx + 2;
15     int largest = idx;
16     if(idx < max/2){//如果idx是叶节点就不用进行调整 
17         if(left < max && cmp(ar[left], ar[largest]) > 0){
18             largest = left;
19         }    
20         if(right < max && cmp(ar[right], ar[largest]) > 0){
21             largest = right;
22         }
23         if(largest != idx){ //如果最大节点不是父节点,那么递归进行交换
24             swap(ar, idx, largest);
25             heapify(ar, cmp, largest, max);   //避免调整之后以max为父节点的子树不是堆 
26         }
27     }
28 }
29 
30 //建立堆
31 static void buildHeap(void **ar, int(*cmp)(const void *, const void *), int n){
32     int i;
33     for(i = n/2 - 1; i >= 0; i--){
34         heapify(ar, cmp, i, n);
35     }
36 }
37 
38 void heapSort(void **ar, int n, int (*cmp)(const void *, const void *)){
39     int i;
40     buildHeap(ar, cmp, n);
41     for(i = n - 1; i >= 1; i--){
42         swap(ar, 0, i);//交换第一个和最后一个
43         heapify(ar, cmp, 0, i);
44     }
45 }
46 //比较数字
47 int numCmp(int i, int j){
48     return i - j;
49 }
50 static void showArray(int a[], int n){
51     int i;
52     for(i = 0; i < n; i++){
53         printf("%d ", a[i]);
54     }
55 }
56 
57 int main(){
58     int a[] = {20, 50, 30, 12, 22, 80, 100, 90, 88, 100, 12, 55, 12, 22, 35, 100};
59     heapSort((void **)a, 16, (int (*)(const void *, const void *))numCmp);
60     showArray(a, 16);
61     getchar();
62 }
复制代码

 

  

  

posted on   Arts&Crafts  阅读(244)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示