浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总
浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024

题目描述

测试点

思路分析

和上一题的思路一样,每进行一次迭代,来验证当前序列是否和给定的序列相同

代码展示

cpp 复制代码
#include <cstdlib>
#include <iostream>
#define MAXSIZE 100
typedef int ElementType;

void swap(int A[], int i, int j)
{
	int temp = A[i];
	A[i] = A[j];
	A[j] = temp;
}

void print(int A[], int N)
{
	for (int i = 0; i < N; i++)
	{
		if (i == 0)
			std::cout << A[i];
		else
			std::cout << ' ' << A[i];
	}
}
bool isSame(int A[], int input[], int N)
{
	for (int i = 0; i < N; i++)
	{
		if (A[i] != input[i])
			return false;
	}
	return true;
}
bool insertion_Sort(int A[], int input[], int N)
{
	/* 算法 */
	int i, j, temp;
	bool flag = false;
	for (i = 1; i < N; i++)
	{	

		temp = A[i];	/* 摸牌 */
		for (j = i; j > 0 && A[j - 1] > temp; j--)
			A[j] = A[j - 1];
		A[j] = temp;

		if (flag == true)
		{
			print(A, N);
			return true;;
		}
		if (isSame(A, input, N))
		{
			std::cout << "Insertion Sort" << std::endl;
			flag = true;
		}
	}
	return false;
}

void percDown(int A[], int p, int N)
{
	/* 将N个元素的数组中以A[p]为根的子堆调整为最大堆 */
	int parent, child;
	int temp = A[p];
	for (parent = p; (parent * 2 + 1) < N; parent = child)
	{
		child = parent * 2 + 1;
		/* child指向左右孩子中较大者 */
		if (child != N - 1 && A[child] < A[child + 1])
			child++;
		if (temp > A[child]) break;
		else A[parent] = A[child];
	}
	A[parent] = temp;
}
void heap_Sort(int A[], int input[], int N)
{	
	bool flag = false;	
	/* 建立大根堆 */
	for (int i = N - 1; i >= 0; i--)
		percDown(A, i, N);
	/* 删除最大值 */
	for (int i = N - 1; i >= 0; i--)
	{
		swap(A, 0, i);
		percDown(A, 0, i);
		if (flag == true)
		{
			print(A, N);
			return;
		}
		if (isSame(A, input, N))
		{
			std::cout << "Heap Sort" << std::endl;
			flag = true;
		}
	}
}
void check(int A[], int input[], int N)
{
	int copyA[MAXSIZE];
	for (int i = 0; i < N; i++)
		copyA[i] = A[i];
	if (insertion_Sort(copyA, input, N))
		return;
	else
	{
		for (int i = 0; i < N; i++)
			copyA[i] = A[i];
		heap_Sort(copyA, input, N);
		return;
	}
}

int main()
{
	int A[MAXSIZE];
	int input[MAXSIZE];
	int N;

	std::cin >> N;
	for (int i = 0; i < N; i++)
		std::cin >> A[i];
	for (int i = 0; i < N; i++)
		std::cin >> input[i];

	check(A, input, N);
	return 0;
}
相关推荐
Yupureki2 小时前
从零开始的C++学习生活 19:C++复习课(5.4w字全解析)
c语言·数据结构·c++·学习·1024程序员节
ゞ 正在缓冲99%…2 小时前
leetcode1312.让字符串成为回文串的最少插入次数
数据结构·算法·leetcode·动态规划·记忆化搜索
laocooon5238578863 小时前
寻找使a×b=c成立的最小进制数(2-16进制)
数据结构·算法
一匹电信狗7 小时前
【牛客CM11】链表分割
c语言·开发语言·数据结构·c++·算法·leetcode·stl
不染尘.7 小时前
图的邻接矩阵实现以及遍历
开发语言·数据结构·vscode·算法·深度优先
xiaoye-duck7 小时前
数据结构之栈和队列-栈
数据结构
山峰哥7 小时前
KingbaseES 表空间与模式优化策略深度研究报告
开发语言·数据结构·数据库·oracle·深度优先
AI科技星9 小时前
基于空间螺旋运动假设的水星近日点进动理论推导与验证
数据结构·人工智能·经验分享·算法·计算机视觉
2501_9387739910 小时前
深度对比 ArrayList 与 LinkedList:从底层数据结构到增删查改的性能差异实测
数据结构
zhangx1234_11 小时前
C语言题目1
c语言·开发语言·数据结构