SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Scalaで
クイックソートを
書いてみよう
2014-02-08 第3回 Scala関西ビギナーズ
14年2月8日土曜日
自己紹介

14年2月8日土曜日
粕谷 大輔
Twitter: @daiksy
フリュー株式会社

自己紹介

14年2月8日土曜日
電子書籍
『開発現場に伝えたい10のこと』
達人出版会 500円

自己紹介

14年2月8日土曜日
ソート

ツリー
探索

ハッシュ

アルゴリズム
スタック & キュー
リスト
動的計画法
14年2月8日土曜日

再帰
新しい言語を学ぶ際に
時々振り返ると
アルゴリズム
いろいろ気づくことがある

14年2月8日土曜日
今回はクイックソートを見てみる

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P

pivot
を決める

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P
C A K B I J F H D E G L Q R N T O S M P

pivotより小さい
グループと
大きいグループに分ける

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P
C A K B I J F H D E G L Q R N T O S M P
A B C K I

J F H D E G L

繰り返す

14年2月8日土曜日

R N M O P Q T S
まずはJavaだとこう書ける

14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}
List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}

listの先頭をpivotとし、
それ以外のlistを取り出す

List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}

pivot以下のグループ

List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}
List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}

pivotより大きいグループ

List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}
List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));

pivot以下のグループ、
pivot、
pivotより大きいグループ
それぞれを再帰的に連結

return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}
List<Integer> rightSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integer pivot = list.get(0);
List<Integer> listWithoutPivot = list.subList(1, list.size());
List<Integer> leftSide = new LinkedList<>();
for (Integer elem : listWithoutPivot) {
if (elem <= pivot) {
leftSide.add(elem);
}
}

ちゃんと読めば意図を理解できるけど、
List<Integer> rightSide = new LinkedList<>();
ぱっと見ではわかりづらくないですか?
for (Integer elem : listWithoutPivot) {
if (elem > pivot) {
rightSide.add(elem);
}
}
List<Integer> result = new ArrayList<>();
result.addAll(sort(leftSide));
result.add(pivot);
result.addAll(sort(rightSide));
return result;
}
}

参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html
14年2月8日土曜日
さて、Scalaで書くとこうなる

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
 

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
listの先頭をpivotとし、
case Nil => data
それ以外のlistを取り出す
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
 

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
pivot以下のグループ
}
 

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
pivotより大きいグループ
 

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
pivot以下のグループ、
}
pivot、
 
pivotより大きいグループ
それぞれを再帰的に連結

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
 

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
 

直感的な気がする!!!

14年2月8日土曜日
CAUTION!!
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _))
}
}
}
 

実はこれ、末尾再帰じゃないので
わりとすぐにスタックオーバーフロー!!

14年2月8日土曜日
まとめ:
Scalaで再帰を使って書くと
手続き的に書くより直感的に
書ける(事がよくある)。

14年2月8日土曜日
宣伝

14年2月8日土曜日
dmm4s

https://github.com/daiksy/dmm4s
14年2月8日土曜日
ご清聴ありがとうございました

14年2月8日土曜日

Más contenido relacionado

Más de Daisuke Kasuya

デブサミ関西 自分戦略 2013
デブサミ関西 自分戦略 2013デブサミ関西 自分戦略 2013
デブサミ関西 自分戦略 2013
Daisuke Kasuya
 
勉強会初心者向け勉強会 Study4bg
勉強会初心者向け勉強会 Study4bg勉強会初心者向け勉強会 Study4bg
勉強会初心者向け勉強会 Study4bg
Daisuke Kasuya
 
忘年会駆動発表
忘年会駆動発表 忘年会駆動発表
忘年会駆動発表
Daisuke Kasuya
 
Play勉強会 in tokyo
Play勉強会 in tokyoPlay勉強会 in tokyo
Play勉強会 in tokyo
Daisuke Kasuya
 
JoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのことJoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのこと
Daisuke Kasuya
 
Play勉強会 playをGAEで動かそう!
Play勉強会 playをGAEで動かそう!Play勉強会 playをGAEで動かそう!
Play勉強会 playをGAEで動かそう!
Daisuke Kasuya
 

Más de Daisuke Kasuya (20)

ScalaMatsuri 2014 LT
ScalaMatsuri 2014 LTScalaMatsuri 2014 LT
ScalaMatsuri 2014 LT
 
DevLOVE甲子園 西日本
DevLOVE甲子園 西日本DevLOVE甲子園 西日本
DevLOVE甲子園 西日本
 
RxTStudy- git gitにされた俺の屍を越えて行け -
RxTStudy- git gitにされた俺の屍を越えて行け -RxTStudy- git gitにされた俺の屍を越えて行け -
RxTStudy- git gitにされた俺の屍を越えて行け -
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
デブサミ関西 自分戦略 2013
デブサミ関西 自分戦略 2013デブサミ関西 自分戦略 2013
デブサミ関西 自分戦略 2013
 
Scala conf2013
Scala conf2013 Scala conf2013
Scala conf2013
 
ペアプロ
ペアプロペアプロ
ペアプロ
 
Dev love関西 forslideshare
Dev love関西 forslideshareDev love関西 forslideshare
Dev love関西 forslideshare
 
git gitにされたオレの屍を超えていけ
git gitにされたオレの屍を超えていけgit gitにされたオレの屍を超えていけ
git gitにされたオレの屍を超えていけ
 
Play勉強会 第3回
Play勉強会 第3回Play勉強会 第3回
Play勉強会 第3回
 
Techreaders3
Techreaders3Techreaders3
Techreaders3
 
鹿駆動勉強会ポスター2
鹿駆動勉強会ポスター2鹿駆動勉強会ポスター2
鹿駆動勉強会ポスター2
 
鹿駆動勉強会ポスター
鹿駆動勉強会ポスター鹿駆動勉強会ポスター
鹿駆動勉強会ポスター
 
勉強会初心者向け勉強会 Study4bg
勉強会初心者向け勉強会 Study4bg勉強会初心者向け勉強会 Study4bg
勉強会初心者向け勉強会 Study4bg
 
鍋駆動
鍋駆動鍋駆動
鍋駆動
 
忘年会駆動発表
忘年会駆動発表 忘年会駆動発表
忘年会駆動発表
 
Play勉強会 in tokyo
Play勉強会 in tokyoPlay勉強会 in tokyo
Play勉強会 in tokyo
 
JoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのことJoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのこと
 
Play勉強会 playをGAEで動かそう!
Play勉強会 playをGAEで動かそう!Play勉強会 playをGAEで動かそう!
Play勉強会 playをGAEで動かそう!
 
Osc kyoto 2011
Osc kyoto 2011Osc kyoto 2011
Osc kyoto 2011
 

Último

Último (11)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

Scala関西ビギナーズ

  • 8. L Q C A K B I J F R H D N T E O S G M P 14年2月8日土曜日
  • 9. L Q C A K B I J F R H D N T E O S G M P pivot を決める 14年2月8日土曜日
  • 10. L Q C A K B I J F R H D N T E O S G M P C A K B I J F H D E G L Q R N T O S M P pivotより小さい グループと 大きいグループに分ける 14年2月8日土曜日
  • 11. L Q C A K B I J F R H D N T E O S G M P C A K B I J F H D E G L Q R N T O S M P A B C K I J F H D E G L 繰り返す 14年2月8日土曜日 R N M O P Q T S
  • 13. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 14. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } listの先頭をpivotとし、 それ以外のlistを取り出す List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 15. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } pivot以下のグループ List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 16. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } pivotより大きいグループ List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 17. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); pivot以下のグループ、 pivot、 pivotより大きいグループ それぞれを再帰的に連結 return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 18. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 19. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } ちゃんと読めば意図を理解できるけど、 List<Integer> rightSide = new LinkedList<>(); ぱっと見ではわかりづらくないですか? for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  • 21. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  • 22. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { listの先頭をpivotとし、 case Nil => data それ以外のlistを取り出す case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  • 23. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } pivot以下のグループ }   14年2月8日土曜日
  • 24. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } } pivotより大きいグループ   14年2月8日土曜日
  • 25. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } pivot以下のグループ、 } pivot、   pivotより大きいグループ それぞれを再帰的に連結 14年2月8日土曜日
  • 26. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  • 27. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   直感的な気がする!!! 14年2月8日土曜日
  • 28. CAUTION!! def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   実はこれ、末尾再帰じゃないので わりとすぐにスタックオーバーフロー!! 14年2月8日土曜日