【海贼王的数据航海】排序——直接选择排序|堆排序

这篇具有很好参考价值的文章主要介绍了【海贼王的数据航海】排序——直接选择排序|堆排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 -> 选择排序

1.1 -> 基本思想

1.2 -> 直接选择排序

1.2.1 -> 代码实现

1.3 -> 堆排序

1.3.1 -> 代码实现


【海贼王的数据航海】排序——直接选择排序|堆排序,数据结构,数据结构--排序,算法,排序算法,数据结构,后端,visualstudio,c语言

1 -> 选择排序

1.1 -> 基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

1.2 -> 直接选择排序

  • 在元素集合arr[i] -- arr[n - 1]中选择关键码最大(或最小)的数据元素
  • 若它不是这组元素中的最后一个(或第一个)元素,则将它与这组元素中的最后一个(或第一个)元素交换
  • 在剩余的arr[i] -- arr[n - 2] (arr[i + 1] -- arr[n - 1]) 集合中,重复上述步骤,直到集合剩余1个元素

【海贼王的数据航海】排序——直接选择排序|堆排序,数据结构,数据结构--排序,算法,排序算法,数据结构,后端,visualstudio,c语言

直接选择排序的特性总结:

  1. 好理解,但效率不是很好,实际中很少使用
  2. 时间复杂度:
  3. 空间复杂度:
  4. 稳定性:不稳定

1.2.1 -> 代码实现

#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 交换
void Swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

// 打印
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);

	printf("\n");
}

// 选择排序
void SelectSort(int* a, int n)
{
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int maxi = begin, mini = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}

			if (a[i] < a[mini])
			{
				mini = i;
			}
		}

		Swap(&a[begin], &a[mini]);
		// 如果maxi和begin重叠,修正一下即可
		if (begin == maxi)
		{
			maxi = mini;
		}

		Swap(&a[end], &a[maxi]);

		++begin;
		--end;
	}
}

void TestSelectSort()
{
	int a[] = { 9, 2, 6, 1, 7, 3 ,0, 5, 8, 4 };
	PrintArray(a, sizeof(a) / sizeof(int));
	SelectSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

int main()
{

	TestSelectSort();

	return 0;
}

【海贼王的数据航海】排序——直接选择排序|堆排序,数据结构,数据结构--排序,算法,排序算法,数据结构,后端,visualstudio,c语言

1.3 -> 堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

【海贼王的数据航海】排序——直接选择排序|堆排序,数据结构,数据结构--排序,算法,排序算法,数据结构,后端,visualstudio,c语言

堆排序特性总结:

  1. 堆排序用堆来选数,效率较高
  2. 时间复杂度:
  3. 空间复杂度:
  4. 稳定性:不稳定

1.3.1 -> 代码实现

#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 交换
void Swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

// 打印
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);

	printf("\n");
}

// 堆排序
void AdjustUp(int* a, int child)
{
	int father = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[father])
		{
			Swap(&a[child], &a[father]);
			//更新下标
			child = father;
			father = (father - 1) / 2;
		}
		else
		{
			break;//一旦符合小堆了,就直接退出
		}
	}
}

void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		// 找出小的那个孩子
		if (child + 1 < n && a[child + 1] > a[child])
		{
			++child;
		}

		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

// 排升序
void HeapSort(int* a, int n)
{
	// 建大堆
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

void TestHeapSort()
{
	int a[] = { 9, 2, 6, 1, 7, 3 ,0, 5, 8, 4 };
	PrintArray(a, sizeof(a) / sizeof(int));
	HeapSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

int main()
{

	TestHeapSort();

	return 0;
}

【海贼王的数据航海】排序——直接选择排序|堆排序,数据结构,数据结构--排序,算法,排序算法,数据结构,后端,visualstudio,c语言


感谢大佬们的支持!!!

互三啦!!!文章来源地址https://www.toymoban.com/news/detail-841378.html

到了这里,关于【海贼王的数据航海】排序——直接选择排序|堆排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【海贼王的数据航海】栈和队列

    目录 1 - 栈 1.1 - 栈的概念及结构 1.2 - 栈的实现 1.2.1 - Stack.h 1.2.2 - Stack.c 1.2.3 - Test.c 2 - 队列 2.1 - 队列的概念及结构 2.2 - 队列的实现 2.2.1 - Queue.h 2.2.2 - Queue.c 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,

    2024年03月14日
    浏览(25)
  • 【海贼王的数据航海】链表—双向链表

    目录 往期 1 - 带头+双向+循环链表(双链表) 1.1 - 接口声明 1.2 - 接口实现 1.2.1 - 双向链表初始化 1.2.2 - 动态申请一个结点 1.2.3 - 双向链表销毁 1.2.4 - 双向链表打印 1.2.5 - 双向链表判空 1.2.6 - 双向链表尾插 1.2.7 - 双向链表尾删 1.2.8 - 双向链表头插 1.2.9 - 双向链表头删

    2024年03月14日
    浏览(32)
  • 【海贼王的数据航海】时间复杂度 | 空间复杂度

    目录 1 - 算法效率 1.1 - 如何衡量一个算法的好坏? 1.2 - 算法的复杂度 2 - 时间复杂度 2.1 - 时间复杂度的概念 2.2 - 大O的渐进表示法 2.3 - 常见时间复杂度计算 3 - 空间复杂度 4 - 常见复杂度对比 对于以下斐波那契数列: 用递归实现斐波那契数列,看上去代码十分简洁,但简洁一

    2024年03月14日
    浏览(33)
  • 大学生bootstrap框架网页作业成品 web前端大作业期末源码 航海王html+jquery+bootstrap响应式网页制作模板 学生海贼王动漫bootstrap框架网站作品

    HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐👇🏻👇🏻👇🏻 ❤ 【作者主页

    2024年02月11日
    浏览(51)
  • 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是数据结构与算法啦,是排序!!!下面,让我们进入七大排序的世界吧!!! 排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在

    2024年02月15日
    浏览(41)
  • 【数据结构 | 直接选择排序】

    直接插入排序(StraightInsertionSort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作: 我们首先使用 max 和 min 两个变量来记录最大和最小值,初始化同时为数组第一个数字

    2024年01月19日
    浏览(29)
  • 【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

    目录 前言 1.直接选择排序 1.1基本思想 1.2直接选择排序实现过程 1.3动图助解 1.4直接选择排序源码 2.堆排序 2.1堆排序的概念 2.2堆排序源码  选择排序有两种常见的【直接选择排序】、【堆排序】 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起

    2024年02月16日
    浏览(39)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(45)
  • 【数据结构】常见排序算法——常见排序介绍、选择排序(直接选择排序、堆排序)交换排序(冒泡排序)

      选择排序是一种简单但不高效的排序算法,其基本思想是从待排序的数据中选择最小(或最大)的元素放到已排序的数据末尾。具体操作步骤如下: (1)找到数据中最小的元素,并把它交换到第一个位置; (2)在剩下未排序的元素中找到最小的元素,并把它交换到已排

    2024年02月04日
    浏览(35)
  • 数据结构--7.2.1排序算法(冒泡、直接选择、直接插入)

            假设含有n个记录的序列为{r1,r2,……,rn},其相应的分别为{K1,K2,……,Kn},需确定1,2,3,……,n的一种排序p1,p2,p3,……,pn;使其相应的满足kp1=kp2=kp3=kp4=……=kpn非递减(或非递增)关系,即使得序列称为一个按有序得序列{rp1,rp2,

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包