1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
+ using NUnit . Framework ;
5
+ using LaYumba . Functional ;
6
+ using static LaYumba . Functional . F ;
4
7
5
8
namespace Exercises . Chapter1
6
9
{
@@ -14,22 +17,59 @@ static Func<T, bool> Negate<T>(this Func<T, bool> pred)
14
17
static List < int > QuickSort ( this List < int > list )
15
18
{
16
19
if ( list . Count == 0 ) return new List < int > ( ) ;
20
+
17
21
var pivot = list [ 0 ] ;
18
- var small = from item in list where item <= pivot select item ;
19
- var large = from item in list where pivot < item select item ;
22
+ var rest = list . Skip ( 1 ) ;
23
+
24
+ var small = from item in rest where item <= pivot select item ;
25
+ var large = from item in rest where pivot < item select item ;
26
+
20
27
return small . ToList ( ) . QuickSort ( )
28
+ . Append ( pivot )
21
29
. Concat ( large . ToList ( ) . QuickSort ( ) )
22
30
. ToList ( ) ;
23
31
}
24
32
33
+ // a more terse solution, using helper methods that will be discussed later in the book
34
+ static List < int > QSort ( this List < int > list )
35
+ => list . Match (
36
+ ( ) => List < int > ( ) ,
37
+ ( pivot , rest ) => rest . Where ( i => i <= pivot ) . ToList ( ) . QSort ( )
38
+ . Append ( pivot )
39
+ . Concat ( rest . Where ( i => pivot < i ) . ToList ( ) . QSort ( ) )
40
+ ) . ToList ( ) ;
41
+
42
+ [ Test ]
43
+ public static void TestQuickSort ( )
44
+ {
45
+ var list = new List < int > { - 100 , 63 , 30 , 45 , 1 , 1000 , - 23 , - 67 , 1 , 2 , 56 , 75 , 975 , 432 , - 600 , 193 , 85 , 12 } ;
46
+ var expected = new List < int > { - 600 , - 100 , - 67 , - 23 , 1 , 1 , 2 , 12 , 30 , 45 , 56 , 63 , 75 , 85 , 193 , 432 , 975 , 1000 } ;
47
+ var actual = list . QuickSort ( ) ;
48
+ Assert . AreEqual ( expected , actual ) ;
49
+ }
50
+
51
+ [ Test ]
52
+ public static void TestQSort ( )
53
+ {
54
+ var list = new List < int > { - 100 , 63 , 30 , 45 , 1 , 1000 , - 23 , - 67 , 1 , 2 , 56 , 75 , 975 , 432 , - 600 , 193 , 85 , 12 } ;
55
+ var expected = new List < int > { - 600 , - 100 , - 67 , - 23 , 1 , 1 , 2 , 12 , 30 , 45 , 56 , 63 , 75 , 85 , 193 , 432 , 975 , 1000 } ;
56
+ var actual = list . QSort ( ) ;
57
+ Assert . AreEqual ( expected , actual ) ;
58
+ }
59
+
25
60
// 3.
26
61
static List < T > QuickSort < T > ( this List < T > list , Comparison < T > compare )
27
62
{
28
63
if ( list . Count == 0 ) return new List < T > ( ) ;
64
+
29
65
var pivot = list [ 0 ] ;
30
- var small = from item in list where compare ( item , pivot ) <= 0 select item ;
31
- var large = from item in list where 0 < compare ( item , pivot ) select item ;
66
+ var rest = list . Skip ( 1 ) ;
67
+
68
+ var small = from item in rest where compare ( item , pivot ) <= 0 select item ;
69
+ var large = from item in rest where 0 < compare ( item , pivot ) select item ;
70
+
32
71
return small . ToList ( ) . QuickSort ( compare )
72
+ . Concat ( new List < T > { pivot } )
33
73
. Concat ( large . ToList ( ) . QuickSort ( compare ) )
34
74
. ToList ( ) ;
35
75
}
0 commit comments