113人参与 • 2024-08-06 • 数据结构
【leftchild = parent * 2 + 1】
【rightchild = parent * 2 + 2】
【parent = (child - 1)/2】
小根堆调整
大根堆调整
void swap(int& x, int& y)
{
int t = x;
x = y;
y = t;
}
void adjust\_down(int\* a, int n, int root)
{
int parent = root;
int child = parent \* 2 + 1;
while (child < n)
{
//选出左右孩子中小的那一个
if (child + 1 < n && a[child + 1] < a[child])
{ //考虑到右孩子越界的情况
child += 1;
//若右孩子来的小,则更新孩子结点为小的那个
}
//交换父亲节点和小的那个孩子结点
if (a[child] < a[parent]){
swap(a[child], a[parent]);
//重置父亲节点和孩子结点
parent = child;
child = parent \* 2 + 1;
}
else { //若已是小根堆,则不交换
break;
}
}
}
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
adjust\_down(a, n, i);
//选出左右孩子中大的那一个
if (child + 1 < n && a[child + 1] > a[child])
{ //考虑到右孩子越界的情况
child += 1;
//若右孩子来的小,则更新孩子结点为小的那个
}
//交换父亲节点和大的那个孩子结点
if (a[child] > a[parent]){
swap(a[child], a[parent]);
//重置父亲节点和孩子结点
parent = child;
child = parent \* 2 + 1;
}
else { //若已是小根堆,则不交换
break;
}
//排升序,建大堆
int end = n - 1; //获取最后一个叶子结点
while (end > 0)
{
swap(a[0], a[end]); //将第一个数与最后一个数交换
adjust\_down(a, end, 0); //向下调整,选出次大的数,再和倒数第二个数交换
end--; //最后一个数前移,上一个交换完后的数不看做堆中的数
}
向下调整算法
建堆
排序
// 测试排序的性能对比
void testop()
{
srand(time(0));
const int n = 100000;
int\* a1 = (int\*)malloc(sizeof(int) \* n);
int\* a2 = (int\*)malloc(sizeof(int) \* n);
int\* a3 = (int\*)malloc(sizeof(int) \* n);
int\* a4 = (int\*)malloc(sizeof(int) \* n);
int\* a5 = (int\*)malloc(sizeof(int) \* n);
int\* a6 = (int\*)malloc(sizeof(int) \* n);
for (int i = 0; i < n; ++i)
{
a1[i] = rand();
a2[i] = a1[i];
a3[i] = a1[i];
a4[i] = a1[i];
a5[i] = a1[i];
a6[i] = a1[i];
}
int begin1 = clock();
insertsort2(a1, n);
int end1 = clock();
int begin2 = clock();
shell\_sort2(a2, n);
int end2 = clock();
int begin3 = clock();
//selectsort(a3, n);
int end3 = clock();
int begin4 = clock();
heap\_sort(a4, n);
int end4 = clock();
int begin5 = clock();
//quicksort(a5, 0, n - 1);
int end5 = clock();
int begin6 = clock();
//mergesort(a6, n);
int end6 = clock();
printf("insertsort:%d\n", end1 - begin1);
printf("shellsort:%d\n", end2 - begin2);
// printf("selectsort:%d\n", end3 - begin3);
printf("heapsort:%d\n", end4 - begin4);
//printf("quicksort:%d\n", end5 - begin5);
//printf("mergesort:%d\n", end6 - begin6);
free(a1);
free(a2);
free(a3);
free(a4);
free(a5);



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
in6);
free(a1);
free(a2);
free(a3);
free(a4);
free(a5);
[外链图片转存中...(img-px6k8khy-1714519107034)]
[外链图片转存中...(img-ewguz6qi-1714519107034)]
[外链图片转存中...(img-83xx3qyq-1714519107034)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论