算法---快速排序
快速排序的步骤
- 在要排序的数组中找一个基准值
- 把小于基准值的数据集中到数组的左边(升序),把大于基准值的数据集中到数组的右边
- 数组的左边和右边重复上边的步骤,直到数组有序
代码(递归)
class Solution:
def quick_sort(self, arr):
n = len(arr)
# 使用递归方法,下面是递归的结束条件
if n <= 1:
return arr
# 一般以数组中间的元素为基准值
mid_index = n // 2
mid_val = arr[mid_index]
left = []
right = []
for i in range(n):
# 如果i为基准索引,则跳过操作
if i == mid_index:
continue
# 把小于基准值的数据放在左数组中
if arr[i] < mid_val:
left.append(arr[i])
else:
# 把大于基准值的数据放在右数组中
right.append(arr[i])
# 将左数组,基准值和右数组整合在一起
return self.quick_sort(left) + [mid_val] + self.quick_sort(right)
if __name__ == "__main__":
arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
s = Solution()
res = s.quick_sort(arr)
print(res)
我们知道递归法一般是用空间换去时间,会加重内存的负担,因此我们可以使用时间换空间的方法。那就是使用双指针
代码(双指针)
import random
class Solution:
def sort_once(self, arr, left, right):
# 获取基准值
pivot_index = random.randint(left, right)
arr[pivot_index], arr[right] = arr[right], arr[pivot_index]
pivot = arr[right]
i = left - 1
for j in range(left, right):
if arr[j] < pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[right] = arr[right], arr[i + 1]
return i + 1
def quick_sort(self, arr, left, right):
if left < right:
index = self.sort_once(arr, left, right)
self.quick_sort(arr, left, index - 1)
self.quick_sort(arr, index + 1, right)
if __name__ == "__main__":
arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
s = Solution()
s.quick_sort(arr, 0, len(arr) - 1)
print(arr)