5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

***すれ立てるまでもない質問はここで 第A刷***

903 :デフォルトの名無しさん:02/02/22 23:24
アルゴリズムについての質問です。

{ 41, 35, 190, 132 }

というような乱数の数列を、

{ 3, 4, 1, 2 }

というように、最も大きい数から順に順位付けした数列に変換する
スマートな方法ってありますでしょうか?

904 :デフォルトの名無しさん:02/02/22 23:25
>>902
単に小数点以下を切り捨てる関数と、
その数を超えない最大の整数を返す関数があるよね。
前者だと0、後者だと-1

905 :デフォルトの名無しさん:02/02/22 23:32
それ、四捨五入の説明になってない。


906 :デフォルトの名無しさん:02/02/22 23:37
>>903
ソートすりゃいいじゃん。
しかも宿題だろ。


907 :デフォルトの名無しさん:02/02/22 23:47
>>906
ソートはやはり必須でしょうか…。
1つのキーは0以上の乱数、数列の長さは256限定です。
現在は暫定的に選択ソートに手を加えて使用していますが、
何かもっと効率の良い方法はないでしょうか?
あ、宿題じゃないです。

908 :デフォルトの名無しさん:02/02/23 00:00
>>907
手間をかけずに書くなら

1. ソートもとの数列の各要素へのポインタを取る
2. ポインタを使ってソート
3. ソート済みのポインタに、順に 1, 2, 3, ... と書き込む

かなぁ。C++ で書くと、こんな感じ。

#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>

using namespace std;
#define NELEM(x)  (sizeof(x) / sizeof(x[0]))

struct pointer_to
{
  template <typename T> T* operator()(T& val) const { return &val; }
};
template <typename T> struct deref_less : public binary_function<T, T, bool>
{
  operator()(T p1, T p2) const { return *p1 < *p2; }
};
struct counter
{
  int count_;
  counter(int count = 0) : count_(count) {}
  void operator()(int* p) { *p = count_++; }
};
struct printer
{
  ostream& ostrm_;
  printer(ostream& ostrm) : ostrm_(ostrm) {}
  template <typename T> void operator()(T& val) { ostrm_ << val; }
};

int main(void)
{
  int series[] = { 41, 35, 190, 132 };
  vector<int*> pseries;

  pseries.reserve(NELEM(series));
  transform(series, series + NELEM(series),
       back_inserter(pseries), pointer_to());
  sort(pseries.begin(), pseries.end(), not2(deref_less<int*>()));
  for_each(pseries.begin(), pseries.end(), counter(1));
  for_each(series, series + NELEM(series), printer(cout));
  return 0;
}


232 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)