当前位置:实例文章 » JAVA Web实例» [文章]排序算法 - 快速排序(4种方法实现)

排序算法 - 快速排序(4种方法实现)

发布人:shili8 发布时间:2025-01-18 14:59 阅读次数:0

**快速排序算法**

快速排序是一种常见的排序算法,属于分治类算法。它通过选择一个基准值,将数据集分成两个子集:小于基准值的元素和大于基准值的元素,然后递归地对这两个子集进行排序。

**快速排序的四种实现方法**

###1. **Lomuto 分割算法**

Lomuto 分割算法是快速排序中最常用的分割算法。它通过选择一个基准值,将数据集分成两个子集:小于基准值的元素和大于基准值的元素。

def lomuto_partition(arr, low, high):
 """
 Lomuto 分割算法 :param arr: 数据集 :param low: 左边界 :param high: 右边界 :return: 基准值索引 """
 pivot = arr[high] #选择基准值为最后一个元素 i = low -1 # 小于基准值的元素索引 for j in range(low, high):
 if arr[j] <= pivot:
 i +=1 arr[i], arr[j] = arr[j], arr[i]

 arr[i +1], arr[high] = arr[high], arr[i +1]
 return i +1def quicksort_lomuto(arr, low, high):
 """
 快速排序(Lomuto 分割算法)

 :param arr: 数据集 :param low: 左边界 :param high: 右边界 """
 if low < high:
 pivot_index = lomuto_partition(arr, low, high)
 quicksort_lomuto(arr, low, pivot_index -1) # 递归排序小于基准值的元素 quicksort_lomuto(arr, pivot_index +1, high) # 递归排序大于基准值的元素# 示例代码arr = [5,2,8,3,1,6,4]
quicksort_lomuto(arr,0, len(arr) -1)
print(arr) # 输出:[1,2,3,4,5,6,8]


###2. **Hoare 分割算法**

Hoare 分割算法是快速排序中另一种分割算法。它通过选择两个基准值,将数据集分成三个子集:小于第一个基准值的元素、在两个基准值之间的元素和大于第二个基准值的元素。

def hoare_partition(arr, low, high):
 """
 Hoare 分割算法 :param arr: 数据集 :param low: 左边界 :param high: 右边界 :return: 基准值索引 """
 pivot1 = arr[low] # 第一个基准值 pivot2 = arr[high] # 第二个基准值 i = low -1 # 小于第一个基准值的元素索引 j = high +1 # 大于第二个基准值的元素索引 while True:
 i +=1 while arr[i] < pivot2: # 找到大于第二个基准值的元素 i +=1 j -=1 while arr[j] > pivot1: # 找到小于第一个基准值的元素 j -=1 if i >= j:
 break arr[i], arr[j] = arr[j], arr[i]

 arr[low], arr[j] = arr[j], arr[low]
 return jdef quicksort_hoare(arr, low, high):
 """
 快速排序(Hoare 分割算法)

 :param arr: 数据集 :param low: 左边界 :param high: 右边界 """
 if low < high:
 pivot_index = hoare_partition(arr, low, high)
 quicksort_hoare(arr, low, pivot_index) # 递归排序小于第一个基准值的元素 quicksort_hoare(arr, pivot_index +1, high) # 递归排序大于第二个基准值的元素# 示例代码arr = [5,2,8,3,1,6,4]
quicksort_hoare(arr,0, len(arr) -1)
print(arr) # 输出:[1,2,3,4,5,6,8]


###3. **双向快速排序**

双向快速排序是一种改进的快速排序算法,通过同时递归地对数据集进行排序,可以显著提高性能。

def dual_quicksort(arr):
 """
 双向快速排序 :param arr: 数据集 """
 if len(arr) <=1:
 return arr pivot = arr[len(arr) //2] #选择基准值为中间元素 left = [x for x in arr if x < pivot] # 小于基准值的元素 middle = [x for x in arr if x == pivot] # 等于基准值的元素 right = [x for x in arr if x > pivot] # 大于基准值的元素 return dual_quicksort(left) + middle + dual_quicksort(right)

# 示例代码arr = [5,2,8,3,1,6,4]
print(dual_quicksort(arr)) # 输出:[1,2,3,4,5,6,8]


###4. **堆排序**

堆排序是一种基于堆的排序算法,通过构建一个最大堆或最小堆,然后逐步地将元素排列到正确位置。

def heapify(arr, n, i):
 """
 堆化 :param arr: 数据集 :param n: 堂数 :param i: 索引 """
 largest = i # 最大堆的根节点索引 left =2 * i +1 # 左子树索引 right =2 * i +2 # 右子树索引 if left < n and arr[left] > arr[largest]:
 largest = left if right < n and arr[right] > arr[largest]:
 largest = right if largest != i:
 arr[i], arr[largest] = arr[largest], arr[i]
 heapify(arr, n, largest)

def heapsort(arr):
 """
 堆排序 :param arr: 数据集 """
 n = len(arr)
 for i in range(n //2 -1, -1, -1):
 heapify(arr, n, i)

 for i in range(n -1,0, -1):
 arr[0], arr[i] = arr[i], arr[0]
 heapify(arr, i,0)

# 示例代码arr = [5,2,8,3,1,6,4]
heapsort(arr)
print(arr) # 输出:[1,2,3,4,5,6,8]


以上是四种快速排序算法的实现代码示例和注释。

其他信息

其他资源

Top