浙江大学数据结构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;
}
相关推荐
<但凡.1 小时前
编程之路,从0开始:知识补充篇
c语言·数据结构·算法
f狐0狸x1 小时前
【数据结构副本篇】顺序表 链表OJ
c语言·数据结构·算法·链表
Tmbcan2 小时前
zkw 线段树-原理及其扩展
数据结构·zkw 线段树
2301_801760932 小时前
数据结构--PriorityQueue
数据结构
乐悠小码2 小时前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
爱吃生蚝的于勒6 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
workflower12 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
一个不喜欢and不会代码的码农13 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
No0d1es15 小时前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(九级)
c语言·数据结构·c++·算法·青少年编程·电子学会
bingw011415 小时前
华为机试HJ42 学英语
数据结构·算法·华为