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.附录--其它解法思路
可以使用堆排序,快速排序,归并排序,也可以使用优先队列。