grades
アレイに重複が含まれている可能性がある場合は、解決が難しくなります。また、grades
配列へのポインタを返すと、呼び出し側は返されたポインタを解放すべきかどうか分からないかもしれないことを忘れないでください。
#include <stdio.h>
#include <stdlib.h>
int* GetMaxGrades(int* grades, int size, int maxGrades) {
if (maxGrades <= 0 || size <= 0)
return NULL;
// first, function must allocate memory every time,
// otherwise you can't understand when to free memory or when do not it.
int *retArray = (int*)malloc(sizeof(int) * maxGrades);
if (maxGrades >= size) {
for (int i = 0; i < size; ++i)
retArray[i] = grades[i];
for (int i = size; i < maxGrades; ++i)
retArray[i] = 0;
}
else {
// need to save positions of found max grades,
// because if there's duplicates among grades,
// you will pick up only different onces.
int *positions = (int*)malloc(sizeof(int) * maxGrades);
for (int i = 0; i < maxGrades; ++i) {
int position = 0;
int maxgrade = INT_MIN;
for (int j = 0; j < size; ++j) {
// pick max grade
if (grades[j] > maxgrade) {
// do not permit duplicates among positions
bool newmax = true;
for (int k = 0; k < i; ++k) {
if (positions[k] == j) {
newmax = false;
break;
}
}
// assign new max value & position
if (newmax) {
position = j;
maxgrade = grades[j];
}
}
}
positions[i] = position;
retArray[i] = maxgrade;
}
free(positions);
}
return retArray;
}
int main(int argc, char* argv[]) {
int a[] = { 90,45,77,43,67,88 };
const int max_grades = 3;
int *p = GetMaxGrades(a, sizeof(a)/sizeof(a[0]), 3);
for (int i = 0; i < max_grades; ++i) {
printf("%d ", p[i]);
}
printf("\n");
free(p);
return 0;
}
あなたは、より簡単になりますqsort
を使用することを許可されている場合は、次の
#include <stdio.h>
#include <stdlib.h>
int greater_comp(const void * a, const void * b) {
return *(int*)b - *(int*)a;
}
int* GetMaxGrades(int* grades, int size, int maxGrades) {
if (maxGrades <= 0 || size <= 0)
return NULL;
int alloc_size = (maxGrades < size) ? size : maxGrades;
// copy grades array (allocate more memory)
int *retArray = (int*)malloc(sizeof(int) * alloc_size);
for (int i = 0; i < size; ++i)
retArray[i] = grades[i];
for (int i = size; i < alloc_size; ++i)
retArray[i] = 0;
// sort: descending order
qsort(retArray, size, sizeof(int), greater_comp);
return retArray;
}
int main(int argc, char* argv[]) {
int a[] = { 90,45,77,43,67,88 };
const int max_grades = 3;
int *p = GetMaxGrades(a, sizeof(a)/sizeof(a[0]), 3);
for (int i = 0; i < max_grades; ++i) {
printf("%d ", p[i]);
}
printf("\n");
free(p);
return 0;
}
そして、あなたは、はるかに容易になるだろうアルゴリズムライブラリを使用する場合:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
vector<int> GetMaxGrades(vector<int> grades, int maxGrades) {
// descending order
sort(grades.begin(), grades.end(), greater<int>());
grades.resize(maxGrades);
return grades;
}
int main(int argc, char* argv[]) {
vector<int> a = { 90,45,77,43,67,88 };
vector<int> p = GetMaxGrades(a, 3);
for (auto& i : p)
cout << i << ' ';
cout << endl;
return 0;
}
最も単純な答え'qsort'で配列を(降順に)ソートし、最初のX個の項目を取ります。あるいは、配列が常にソートされるように、新しい項目を 'retArray'の正しい場所に挿入する必要があります。 – user3386109
67が小さくても、77で88を上書きしています。最初に見つけたものではなく、retArrayの最小値を置き換える必要があります。 – stark
'calloc(sizeof(int)* maxGrades)' - > 'calloc(maxGrades、sizeof(int))' – BLUEPIXY