From c1533114d4b4c7d5b1b83801fa12d4fd7af0f751 Mon Sep 17 00:00:00 2001
From: lucas8485 <1443937075@qq.com>
Date: Fri, 12 Aug 2022 12:36:53 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=86=97=E4=BD=99=E8=AF=AD?=
=?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=AF=B9=E5=BA=94=E4=BF=AE=E6=94=B9=E4=BA=86?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../.idea/workspace.xml | 20 +++++++++----
Algorithm-FSharp/MergeSort.fs | 29 +++++++++----------
Algorithm-FSharp/Program.fs | 4 +--
Algorithm-FSharp/QuickSort.fs | 10 +++----
4 files changed, 34 insertions(+), 29 deletions(-)
diff --git a/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml b/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml
index 607b768..57bb067 100644
--- a/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml
+++ b/.idea/.idea.Algorithm-FSharp/.idea/workspace.xml
@@ -7,11 +7,11 @@
-
-
+
-
+
+
@@ -97,7 +97,7 @@
-
+
1660059459924
@@ -127,7 +127,14 @@
1660187524761
-
+
+ 1660278379103
+
+
+
+ 1660278379103
+
+
@@ -153,6 +160,7 @@
-
+
+
\ No newline at end of file
diff --git a/Algorithm-FSharp/MergeSort.fs b/Algorithm-FSharp/MergeSort.fs
index 5652b85..b77baaf 100644
--- a/Algorithm-FSharp/MergeSort.fs
+++ b/Algorithm-FSharp/MergeSort.fs
@@ -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) [] // 将两部分分别归并排序,然后合并为有序数列
\ No newline at end of file
+ merge (mergesort left) (mergesort right) // 将两部分分别归并排序,然后合并为有序数列
\ No newline at end of file
diff --git a/Algorithm-FSharp/Program.fs b/Algorithm-FSharp/Program.fs
index e08927a..932d55d 100644
--- a/Algorithm-FSharp/Program.fs
+++ b/Algorithm-FSharp/Program.fs
@@ -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}"
diff --git a/Algorithm-FSharp/QuickSort.fs b/Algorithm-FSharp/QuickSort.fs
index c051e6c..b727c58 100644
--- a/Algorithm-FSharp/QuickSort.fs
+++ b/Algorithm-FSharp/QuickSort.fs
@@ -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 -> // 多于一个元素的列表,选取列表的头元素作为参考数