@@ -8,22 +8,22 @@ def sortArray(self, nums):
8
8
:type nums: List[int]
9
9
:rtype: List[int]
10
10
"""
11
- def mergeSort (start , end , nums ):
12
- if end - start <= 1 :
11
+ def mergeSort (left , right , nums ):
12
+ if left >= right :
13
13
return
14
- mid = start + (end - start ) // 2
15
- mergeSort (start , mid , nums )
16
- mergeSort (mid , end , nums )
17
- right = mid
14
+ mid = left + (right - left ) // 2
15
+ mergeSort (left , mid , nums )
16
+ mergeSort (mid + 1 , right , nums )
17
+ r = mid + 1
18
18
tmp = []
19
- for left in xrange (start , mid ):
20
- while right < end and nums [right ] < nums [left ]:
21
- tmp .append (nums [right ])
22
- right += 1
23
- tmp .append (nums [left ])
24
- nums [start : start + len (tmp )] = tmp
19
+ for l in xrange (left , mid + 1 ):
20
+ while r <= right and nums [r ] < nums [l ]:
21
+ tmp .append (nums [r ])
22
+ r += 1
23
+ tmp .append (nums [l ])
24
+ nums [left : left + len (tmp )] = tmp
25
25
26
- mergeSort (0 , len (nums ), nums )
26
+ mergeSort (0 , len (nums )- 1 , nums )
27
27
return nums
28
28
29
29
@@ -37,36 +37,38 @@ def sortArray(self, nums):
37
37
:type nums: List[int]
38
38
:rtype: List[int]
39
39
"""
40
- def kthElement (nums , left , k , right , compare ):
41
- def PartitionAroundPivot (left , right , pivot_idx , nums , compare ):
42
- new_pivot_idx = left
43
- nums [pivot_idx ], nums [right ] = nums [right ], nums [pivot_idx ]
44
- for i in xrange (left , right ):
45
- if compare (nums [i ], nums [right ]):
46
- nums [i ], nums [new_pivot_idx ] = nums [new_pivot_idx ], nums [i ]
47
- new_pivot_idx += 1
40
+ def nth_element (nums , left , n , right , compare = lambda a , b : a < b ):
41
+ def tri_partition (nums , left , right , target ):
42
+ i = left
43
+ while i <= right :
44
+ if compare (nums [i ], target ):
45
+ nums [i ], nums [left ] = nums [left ], nums [i ]
46
+ left += 1
47
+ i += 1
48
+ elif compare (target , nums [i ]):
49
+ nums [i ], nums [right ] = nums [right ], nums [i ]
50
+ right -= 1
51
+ else :
52
+ i += 1
53
+ return left , right
48
54
49
- nums [right ], nums [new_pivot_idx ] = nums [new_pivot_idx ], nums [right ]
50
- return new_pivot_idx
51
-
52
- right -= 1
53
55
while left <= right :
54
56
pivot_idx = random .randint (left , right )
55
- new_pivot_idx = PartitionAroundPivot ( left , right , pivot_idx , nums , compare )
56
- if new_pivot_idx == k :
57
+ pivot_left , pivot_right = tri_partition ( nums , left , right , nums [ pivot_idx ] )
58
+ if pivot_left <= n <= pivot_right :
57
59
return
58
- elif new_pivot_idx > k :
59
- right = new_pivot_idx - 1
60
- else : # new_pivot_idx < k .
61
- left = new_pivot_idx + 1
62
-
63
- def quickSort (start , end , nums ):
64
- if end - start <= 1 :
60
+ elif pivot_left > n :
61
+ right = pivot_left - 1
62
+ else : # pivot_right < n .
63
+ left = pivot_right + 1
64
+
65
+ def quickSort (left , right , nums ):
66
+ if left > right :
65
67
return
66
- mid = start + (end - start ) / 2
67
- kthElement (nums , start , mid , end , lambda a , b : a < b )
68
- quickSort (start , mid , nums )
69
- quickSort (mid , end , nums )
68
+ mid = left + (right - left ) // 2
69
+ nth_element (nums , left , mid , right )
70
+ quickSort (left , mid - 1 , nums )
71
+ quickSort (mid + 1 , right , nums )
70
72
71
- quickSort (0 , len (nums ), nums )
73
+ quickSort (0 , len (nums )- 1 , nums )
72
74
return nums
0 commit comments