it编程 > 软件设计 > 数据结构

数据结构 排序算法——选择排序与堆排序_直接选择排序和堆序的区别(1)

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);

⏳排升序,建大堆or小堆?

//选出左右孩子中大的那一个
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);


![img](https://img-blog.csdnimg.cn/img_convert/5b26623b4f611cbf83023994d949bc03.png)
![img](https://img-blog.csdnimg.cn/img_convert/b53c9c22fdadc7f77f801a7f62a54a26.png)
![img](https://img-blog.csdnimg.cn/img_convert/51ff142a96729ef5a2d45451d6e8c7b2.png)

**既有适合小白学习的零基础资料,也有适合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)**

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

数据结构之排序算法(三)

08-06

【数据结构】——归并排序和计数排序

08-06

【数据结构】哈希表上——开放寻址法

08-06

-哈希表-

08-06

ID决策树的构造原理

08-06

2. 基础数据结构之哈希表

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论