寻找大富翁--希尔排序

0x01.问题

注:本题来自PTA-数据结构与算法题目集(中文)-7-38 寻找大富翁 ,原题:https://pintia.cn/problem-sets/15/problems/865

0x02.分析

这就是个排序的问题,降序排序,由于数据量太大,肯定不能用普通的排序方法,这里选择希尔排序。

0x03.代码(希尔排序)

#include<stdio.h>


#define MAXSIZE 100000
typedef struct
{
	int r[MAXSIZE + 1];
	int length;
}SqList;

void swap(SqList* L, int i, int j)
{
	int temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp;
}


void ShellSort(SqList* L)
{
	int i, j;
	int increment = L->length;
	do
	{
		increment = increment / 3 + 1;
		for (i = increment + 1; i <= L->length; i++)
		{
			if (L->r[i] > L->r[i - increment])
			{
				L->r[0] = L->r[i];
				for (j = i - increment; j > 0 && L->r[j] < L->r[0]; j -= increment)
				{
					L->r[j + increment] = L->r[j];
				}
				L->r[j + increment] = L->r[0];
			}
		}
	} while (increment > 1);
}


void ReadData(SqList* L, int n)
{
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &L->r[i]);
		L->length++;
	}
}

void PrintData(SqList* L, int m)
{
	if (m > L->length)
	{
		m = L->length;
	}
	printf("%d", L->r[1]);
	for (int i = 2; i <= m; i++)
	{
		printf(" %d", L->r[i]);
	}
}

int main()
{
	int n, m;
	SqList L;
	L.length = 0;
	scanf("%d %d", &n, &m);
	ReadData(&L, n);
	ShellSort(&L);
	PrintData(&L, m);
}

希尔排序是不稳定排序,所以通过时间可能会有较大差异。

0x04.附录--其它解法思路

可以使用堆排序,快速排序,归并排序,也可以使用优先队列。

发布了99 篇原创文章 · 获赞 114 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104773390