Scalaクイックソートアルゴリズム
一、ソースコード
二、アルゴリズムの核心
1)クイックソート比較の基準として要素を事前に選択します.基准より大きい数を右に、基准より小さい数を左に、一度に大きい、小さいの2种类に分けます.
2)各クラスは,1つの基準を選択することによって再びサイズの分類を行う.左右にデータがないまで.
三、再帰的な解釈
再帰を理解する鍵は、まずそれを受け入れることにある.「sort関数は入力したリストをソートできる」と事前に示唆した.
この暗示に従ってsort関数の体内に入り,2つの状況に分けた.
1)伝達されたものがNilであればNilに戻る--そう、sortがNilをソートする.
2)Nilでない場合、sortはリストlsを2つの部分leftとrightに分解し、実際には最初のtailもある.次に、並べ替えられたleft+ヘッダbase+で並べ替えられたrightのリストを返します.もちろんsortメソッドはその承諾を実現し,返されるリストはシーケンス化されている.
クイックソートを理解したのは幸いではありませんが、その後、このヒントを飛び出して、なぜ2)のsortがソートを完了できるのかを説得する必要があります(この場合、内部の自己呼び出しを別の関数と見なす必要があります).
合理的な解釈はsortがリストに入ることができることです
左右の2つの部分に分割し、1つの分割関数を使用してNilになるまで分割を続けます.ここでの分割関数はsortであり,この解釈の重点はソートではなく「分割」にある.すなわち,1)は受け入れられるので,2)から1)に移行してsortがソートを完了できるようにする.
これは私の迅速なソートに対する理解で、後でいつの間にか証明になって、もちろんこれは証明ではありません.私の目的は、迅速なソートにおける再帰的な考えを伝えることです.
def sort(ls: List[Int]): List[Int] = {
ls match {
case Nil => Nil // ,
case base :: tail => { //
val (left, right) = tail.partition(_ < base) //
sort(left) ::: base :: sort(right) // ——sort( )+ +sort( )
}
}
}
二、アルゴリズムの核心
1)クイックソート比較の基準として要素を事前に選択します.基准より大きい数を右に、基准より小さい数を左に、一度に大きい、小さいの2种类に分けます.
2)各クラスは,1つの基準を選択することによって再びサイズの分類を行う.左右にデータがないまで.
三、再帰的な解釈
再帰を理解する鍵は、まずそれを受け入れることにある.「sort関数は入力したリストをソートできる」と事前に示唆した.
この暗示に従ってsort関数の体内に入り,2つの状況に分けた.
1)伝達されたものがNilであればNilに戻る--そう、sortがNilをソートする.
2)Nilでない場合、sortはリストlsを2つの部分leftとrightに分解し、実際には最初のtailもある.次に、並べ替えられたleft+ヘッダbase+で並べ替えられたrightのリストを返します.もちろんsortメソッドはその承諾を実現し,返されるリストはシーケンス化されている.
クイックソートを理解したのは幸いではありませんが、その後、このヒントを飛び出して、なぜ2)のsortがソートを完了できるのかを説得する必要があります(この場合、内部の自己呼び出しを別の関数と見なす必要があります).
合理的な解釈はsortがリストに入ることができることです
左右の2つの部分に分割し、1つの分割関数を使用してNilになるまで分割を続けます.ここでの分割関数はsortであり,この解釈の重点はソートではなく「分割」にある.すなわち,1)は受け入れられるので,2)から1)に移行してsortがソートを完了できるようにする.
これは私の迅速なソートに対する理解で、後でいつの間にか証明になって、もちろんこれは証明ではありません.私の目的は、迅速なソートにおける再帰的な考えを伝えることです.