(c语言详解)09-排序1 排序(详细解释)

本博文源于浙江大学《数据结构》,这道题目测试的不是编程能力,而是我们的排序速度快不快,因此我直接来个稳打稳的排序:堆排序
因为此题考察的原因,附上我的所有排序的博文,供大家作自己的优选。
42、(C语言浙大版)小白实现归并排序非递归版并分析基本原理(附测试用例)
41、(C语言浙大版)小白实现归并排序递归版本并分析基本原理(附测试用例)
40、C语言浙大版)小白实现Sedgewick希尔排序并分析(附测试用例)
39、(C语言浙大版)小白实现堆排序并分析核心思想(附测试用例)
38、(C语言浙大版)小白实现选择排序并分析复杂度(附测试用例)
37、(C语言浙大版)小白实现希尔排序并分析增量序列(附测试用例)
36、(C语言浙大版)小白实现插入排序并分析逆序对(附测试用例)
35、(C语言浙大版)小白实现冒泡排序(附测试用例)
大家如果自己感兴趣,可以选自己喜欢的进行尝试,我先附上题目:

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。

输入格式:

输入第一行给出正整数N(≤10^​5),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981

下面附上堆排序通过代码:

//堆排序
#include
typedef int ElementType;
void Print_Array(ElementType A[],int N)
{
	for(int i=0;i<N;i++){
		if (i<N-1)
			printf("%d ",A[i]);
		else
			printf("%d",A[i]);
	}
		
}
void Swap(int *X,int *Y)
{
	int tmp = *X;
	*X = *Y;
	*Y = tmp;
}
void PercDown(ElementType A[],int p,int N)
{
	int Parent,Child;
	ElementType X;
	X = A[p];
	for(Parent = p;(Parent*2+1)<N;Parent=Child) {
		Child = Parent * 2+1;
		if((Child != N-1) && (A[Child]<A[Child+1]))
			Child ++;
		if(X>=A[Child]) break;
		else
			A[Parent] = A[Child];
	}
	A[Parent] = X;
}

void Heap_Sort(ElementType A[],int N)
{
	int i;
	for(i=N/2-1; i>=0;i--)
		PercDown(A,i,N);
	for(i=N-1;i>0;i--)
	{
		Swap(&A[0],&A[i]);
		PercDown(A,0,i);
	}
}
int main()
{
	int N;
	scanf("%d",&N);
	int arr[N];
	for(int i=0;i<N;i++)
		scanf("%d",&arr[i]);

	Heap_Sort(arr,N);
	Print_Array(arr,N);
	return 0;
	
}

你可能感兴趣的:(浙大pta)