Skip to content

Commit f598753

Browse files
authored
Update sort-an-array.py
1 parent 2f5b25d commit f598753

File tree

1 file changed

+41
-39
lines changed

1 file changed

+41
-39
lines changed

Python/sort-an-array.py

+41-39
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,22 @@ def sortArray(self, nums):
88
:type nums: List[int]
99
:rtype: List[int]
1010
"""
11-
def mergeSort(start, end, nums):
12-
if end - start <= 1:
11+
def mergeSort(left, right, nums):
12+
if left >= right:
1313
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
1818
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
2525

26-
mergeSort(0, len(nums), nums)
26+
mergeSort(0, len(nums)-1, nums)
2727
return nums
2828

2929

@@ -37,36 +37,38 @@ def sortArray(self, nums):
3737
:type nums: List[int]
3838
:rtype: List[int]
3939
"""
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
4854

49-
nums[right], nums[new_pivot_idx] = nums[new_pivot_idx], nums[right]
50-
return new_pivot_idx
51-
52-
right -= 1
5355
while left <= right:
5456
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:
5759
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:
6567
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)
7072

71-
quickSort(0, len(nums), nums)
73+
quickSort(0, len(nums)-1, nums)
7274
return nums

0 commit comments

Comments
 (0)