質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

6110閲覧

高速で省メモリな複数配列のソート

_nyannyan_

総合スコア124

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

3クリップ

投稿2015/10/29 17:14

編集2015/10/29 18:32

2つのキー配列と値配列をキー配列でソートしたいです。
なるべく余分なメモリを確保せずに高速にソートしたいです。
ソート部分は自分で書かずにstd::sortなどをつかいたいです。
現在は構造体の配列に詰め直してからソートする実装になっているので入力と同じサイズのワーキングスペースを使っています。
うまい方法はないでしょうか?

C++

1//sample.cpp 2template <typename T> sort(const int flag,int *k1,int *k2,T *v,const int n){ 3 // flagによってk1とk2のどちらをプライマリキーとするか制御してソート 4 // 不安定なソートでもよい 5} 6int main(){ 7 int keys1[] = {0 , 4 , 5 , 2 , 2 , 2}; 8 int keys2[] = {1 , 5 , 2 , 4 , 0 , 3}; 9 float vals[] = {1 , 2 , 3 , 4 , 5 , 6}; 10 sort<float>(keys1,keys2,vals,6); 11 // 期待する出力 12 // keys1 : 0 2 2 2 4 5 13 // keys2 : 1 0 3 4 5 2 14 // vals : 1 5 6 4 2 3 15}

C++

1// 現在の実装 2// ワーキングスペースとして入力と同じサイズの配列を用いてしまっている 3template <typename T> struct k1_k2 { 4 int k1; 5 int k2; 6 T val; 7 bool operator<(const k1_k2<T> &obj){ 8 return k1 < obj.k1 || (k1 == obj.k1 && k2 < obj.k2); 9 } 10 bool operator>(const k1_k2<T> &obj){ 11 return k1 > obj.k1 || (k1 == obj.k1 && k2 > obj.k2); 12 } 13}; 14template <typename T> struct k2_k1 { 15 int k1; 16 int k2; 17 T val; 18 bool operator<(const k2_k1<T> &obj){ 19 return k2 < obj.k2 || (k2 == obj.k2 && k1 < obj.k1); 20 } 21 bool operator>(const k2_k1<T> &obj){ 22 return k2 > obj.k2 || (k2 == obj.k2 && k1 > obj.k1); 23 } 24}; 25 26template <typename T> sort(const int flag,int *k1,int *k2,T *v,const int n){ 27 if(flag & K1_K2){ 28 vector< k1_k2<T> > vec(n); 29 for(int i=0 ; i<n ; ++i){ vec[i].k1 = k1[i]; vec[i].k2 = k2[i]; vec.val[i] = v[i]; } 30 if(flag & ASC){ 31 std::sort(vec.begin(),vec.end(),less< k1_k2<T> >()); 32 }else{ 33 std::sort(vec.begin(),vec.end(),greater< k1_k2<T> >()); 34 } 35 }else{ 36 vector< k2_k1<T> > vec(n); 37 for(int i=0 ; i<n ; ++i){ vec[i].k1 = k1[i]; vec[i].k2 = k2[i]; vec.val[i] = v[i]; } 38 if(flag & ASC){ 39 std::sort(vec.begin(),vec.end(),less< k2_k1<T> >()); 40 }else{ 41 std::sort(vec.begin(),vec.end(),greater< k2_k1<T> >()); 42 } 43 } 44}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

標準関数は,よく使われると思われるプログラムのパーツを作っておくことで,
プログラミングの効率を上げるためにあります.
このような特殊な事情に配慮できるような関数は,
標準の形に合わせるか,通常自分で作らなければなりません.
高速なソートプログラムを書くのは大変なので,
データ構造をstd::sortに合うように変えるべきかと思います.
配列ではなくvectorなどでもstd::sortは使えますが,少し呼び出し方が変わります.

c++

1#include <iostream> 2 3struct data_t { 4 int key1; 5 int key2; 6 float value; 7}; 8 9bool cmp(const data_t& left, const data_t& right) { 10 return (left.key1 == right.key1) ? (left.key2 < right.key2) : (left.key1 < right.key1); 11} 12 13int main(){ 14 struct data_t data[] = {{0, 1, 1}, {4, 5, 2}, {5, 2, 3}, {2, 4, 4}, {2, 0, 5}, {2, 3, 6}}; 15 std::sort(data, data + 6, cmp); 16 for (int i = 0; i < 6; i++) 17 std::cout << "{" << data[i].key1 18 << "," << data[i].key2 19 << "," << data[i].value << "}" 20 << std::endl; 21 22 return 0; 23}

投稿2015/10/29 17:51

KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/10/30 00:57

複数の値を使って大小比較する時、std::tieが便利ですよ。 ここにも良くいらっしゃるyohhoyさんのサイトに分かりやすい解説があります。 http://d.hatena.ne.jp/yohhoy/20120218/p1 展開型を見ると==を使ってないので違うような気がしてしまいますが、>だけを使うためにdon't careをうまいこと使っているだけで、期待通りの大小比較になってます。
KenTerada

2015/10/30 05:43

普段はC++を使っていないので,勉強になりました!ありがとうございます.
Chironian

2015/10/30 10:39

いえいえ、私もつい最近std::tieを知って衝撃を受けたばかりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問