修正冗余语法,对应修改了相关注释
This commit is contained in:
parent
1592f00810
commit
c1533114d4
|
@ -7,11 +7,11 @@
|
|||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="32b2067c-6667-4162-834b-afaa5fbc533d" name="Changes" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/Algorithm-FSharp/SelectionSort.fs" afterDir="false" />
|
||||
<list default="true" id="32b2067c-6667-4162-834b-afaa5fbc533d" name="Changes" comment="施工阶段3:选择排序">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Algorithm-FSharp/Algorithm-FSharp.fsproj" beforeDir="false" afterPath="$PROJECT_DIR$/Algorithm-FSharp/Algorithm-FSharp.fsproj" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Algorithm-FSharp/MergeSort.fs" beforeDir="false" afterPath="$PROJECT_DIR$/Algorithm-FSharp/MergeSort.fs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Algorithm-FSharp/Program.fs" beforeDir="false" afterPath="$PROJECT_DIR$/Algorithm-FSharp/Program.fs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Algorithm-FSharp/QuickSort.fs" beforeDir="false" afterPath="$PROJECT_DIR$/Algorithm-FSharp/QuickSort.fs" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
@ -97,7 +97,7 @@
|
|||
<workItem from="1660181422024" duration="2137000" />
|
||||
<workItem from="1660186635954" duration="1867000" />
|
||||
<workItem from="1660231505344" duration="3491000" />
|
||||
<workItem from="1660267756436" duration="6060000" />
|
||||
<workItem from="1660267756436" duration="6685000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="施工阶段1 快速排序">
|
||||
<created>1660059459924</created>
|
||||
|
@ -127,7 +127,14 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1660187524761</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="5" />
|
||||
<task id="LOCAL-00005" summary="施工阶段3:选择排序">
|
||||
<created>1660278379103</created>
|
||||
<option name="number" value="00005" />
|
||||
<option name="presentableId" value="LOCAL-00005" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1660278379103</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="6" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
|
@ -153,6 +160,7 @@
|
|||
<MESSAGE value="施工阶段1:快速排序" />
|
||||
<MESSAGE value="真的只是一点小问题!" />
|
||||
<MESSAGE value="施工阶段2:归并排序" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="施工阶段2:归并排序" />
|
||||
<MESSAGE value="施工阶段3:选择排序" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="施工阶段3:选择排序" />
|
||||
</component>
|
||||
</project>
|
|
@ -1,26 +1,25 @@
|
|||
module Algorithm_FSharp.MergeSort
|
||||
|
||||
// 合并有序数列算法
|
||||
// merge : 'a list -> 'a list -> 'a list -> 'a list
|
||||
// 待合并的有序数列存储在lhs和rhs中,每一步合并后中间结果都存放在res中
|
||||
let rec merge lhs rhs res =
|
||||
// merge : 'a list -> 'a list -> 'a list
|
||||
// 待合并的有序数列存储在lhs和rhs中,每一步合并后结果为函数的返回值
|
||||
let rec merge lhs rhs =
|
||||
match (lhs, rhs) with // 判断lhs和rhs是否为空
|
||||
| [], [] -> res // 若两者均为空,直接返回res
|
||||
| [], ys -> res @ ys // 若lhs中的数已经用光,则将rhs追加到res末尾并返回
|
||||
| xs, [] -> res @ xs // 若rhs中的数已经用光,则将lhs追加到res末尾并返回
|
||||
| [], [] -> [] // 若两者均为空,直接返回res
|
||||
| [], ys -> ys // 若lhs中的数已经用光,则返回rhs
|
||||
| xs, [] -> xs // 若rhs中的数已经用光,则返回lhs
|
||||
| x::xs, y::ys -> // 若二者均不为空
|
||||
match x < y with // 取出第一个元素,并判断二者的大小关系
|
||||
| true -> merge xs (y::ys) (res @ [x]) // 若lhs的第一个元素小于rhs的第一个元素,则将其取出并放置在res的末尾,递归合并剩余的元素
|
||||
| false -> merge (x::xs) ys (res @ [y]) // 若rhs的第一个元素小于lhs的第一个元素,则将其取出并放置在res的末尾,递归合并剩余的元素
|
||||
| true -> x::(merge xs (y::ys)) // 若lhs的第一个元素小于rhs的第一个元素,则将x放置在合并结果头部,递归合并剩余的元素
|
||||
| false -> y::(merge (x::xs) ys) // 若rhs的第一个元素小于lhs的第一个元素,则将y放置在合并结果头部,递归合并剩余的元素
|
||||
|
||||
// 归并排序算法的F#实现
|
||||
// mergesort : 'a list -> 'a list
|
||||
let rec mergesort arr =
|
||||
match arr with // 模式匹配
|
||||
| [] -> [] // 若arr为空或只有一个元素,则它已经有序,直接返回
|
||||
let rec mergesort = function
|
||||
| [] -> [] // 若待排序序列为空或只有一个元素,则它已经有序,直接返回
|
||||
| [single] -> [single]
|
||||
| _ -> // 若arr的元素多于一个
|
||||
let mid = arr.Length / 2 // 计算序列中点的索引
|
||||
let left, right = arr // 从中点切分序列为两部分
|
||||
| xs -> // 若待排序序列的元素多于一个
|
||||
let mid = xs.Length / 2 // 计算序列中点的索引
|
||||
let left, right = xs // 从中点切分序列为两部分
|
||||
|> List.splitAt mid
|
||||
merge (mergesort left) (mergesort right) [] // 将两部分分别归并排序,然后合并为有序数列
|
||||
merge (mergesort left) (mergesort right) // 将两部分分别归并排序,然后合并为有序数列
|
|
@ -1,8 +1,8 @@
|
|||
// For more information see https://aka.ms/fsharp-console-apps
|
||||
module Algorithm_FSharp.Program
|
||||
open Algorithm_FSharp.SelectionSort
|
||||
open Algorithm_FSharp.QuickSort
|
||||
open Algorithm_FSharp.TestList
|
||||
|
||||
// 测试用例
|
||||
printfn $"%A{myList
|
||||
|> selection_sort}"
|
||||
|> quicksort}"
|
||||
|
|
|
@ -3,10 +3,9 @@ module Algorithm_FSharp.QuickSort
|
|||
// 序列切割算法
|
||||
// partition : ('a -> bool) -> 'a list -> 'a list * 'a list
|
||||
// 按pred切割序列,返回的元组中第一个元素是满足条件的元素序列,第二个元素是不满足条件的元素序列
|
||||
let rec partition pred lst =
|
||||
match lst with // 模式匹配
|
||||
| [] -> [],[] // list为空,返回两个空列表
|
||||
| head::tail -> // list不为空,切割出第一个元素head和剩余的元素组成的序列tail
|
||||
let rec partition pred = function
|
||||
| [] -> [],[] // 待切分序列为空,返回两个空列表
|
||||
| head::tail -> // 待切分序列不为空,切割出第一个元素head和剩余的元素组成的序列tail
|
||||
let matched, unmatched = partition pred tail // 递归调用partition完成序列切割,此时matched、unmatched分别为匹配谓词和不匹配谓词的元素序列
|
||||
match (pred head) with // 对当前元素进行判断
|
||||
| true -> head::matched, unmatched // 若匹配谓词,则将其追加至matched的头部并返回
|
||||
|
@ -14,8 +13,7 @@ let rec partition pred lst =
|
|||
|
||||
// quicksort : 'a list -> 'a list
|
||||
// 快速排序的F#实现
|
||||
let rec quicksort i =
|
||||
match i with // 模式匹配
|
||||
let rec quicksort = function
|
||||
| [] -> [] // 空列表和只有一个元素的列表都返回自身即可
|
||||
| [single] -> [single] // 这两种情况下序列都完全有序
|
||||
| head :: tail -> // 多于一个元素的列表,选取列表的头元素作为参考数
|
||||
|
|
Loading…
Reference in New Issue