输入 arr[] // 输入待排序序列 quick_sort(arr[] , p , q): // [p , q] 用于指定当前要处理的子序列 if q-p <= 0: // 如果序列中没有元素或者仅包含 1 个元素,则直接返回 return else: par <- partition(arr , p , q) // partition()函数用于将 [p,q] 区域分割成 [p, par-1] 和 [par+1, q] 区域,[p, par-1] 区域的元素都比 pivot 小,[par+1 , q] 区域的元素都比 pivot 大,函数会返回中间元素 pivot 所在的位置。 quick_sort(arr , p , par-1) // 将 [p , par-1] 作为待排序序列,重复进行分割 quick_sort(arr , par+1 , q) // 将 [par+1 , q] 作为待排序序列,重复进行分割借助伪代码,我们了解了快速排序的实现过程,接下来要解决的问题是如何设计 partition() 函数,即如何将 [p, q] 区域的待排序序列分成 [p, par-1] 和 [par+1, q] 两个子序列,同时保证 [p, par-1] 区域内的所有元素比 par 位置上的元素小,[par+1, q] 区域内的所有元素比 par 位置上的元素大?
可以看到,最终元素 31 左侧的元素都比它小,右侧的元素都比它大。如下是实现 partition() 函数的伪代码:
partition(arr[] , p , q): // [p , q] 为要分割的区域 lo <- p // lo、hi 准备遍历 [p , q-1] 区域 hi <- q-1 pivot <- arr[q] // 以 [p , q] 区域中最后一个元素作为中间值 while true: // 一直循环,直到执行 end while while arr[lo] < pivot: // lo 从左往右遍历,直至找到一个不小于 pivot 的元素 lo <- lo+1 while hi>0 and arr[hi] > pivot: // hi 从右往左遍历,直至找到一个不小于 pivot 的元素 hi <- hi-1 if lo ≥ hi: // 如果 lo 大于等于 hi,退出循环 end while else: swap arr[lo] , arr[hi] // 交换 arr[lo] 和 arr[hi] 的值 lo <- lo+1 // 分别将 lo 和 hi 向前移动一步,准备遍历后续的元素 hi <- hi-1 swap arr[lo] , arr[q] // 跳出循环后,交换 arr[lo] 和 arr[q] 的值 return lo // 返回 lo 的值,也就是中间值所在序列中的位置
#include <stdio.h> // arr 为待排序数组,[p,q] 用于指定排序区域 int partition(int* arr, int p, int q) { int temp = 0; // lo、hi分别表示指向首个元素和倒数第 2 个元素的指针 int lo = p; int hi = q - 1; //pivot 表示选中的中间值 int pivot = arr[q]; while (1) { //lo从左往右遍历,直至找到一个不小于 pivot 的元素 while (arr[lo] < pivot) { lo++; }; //hi从右往左遍历,直至找到一个不大于 pivot 的元素 while (hi > 0 && arr[hi] > pivot) { hi--; } //如果 lo≥hi,退出循环 if (lo >= hi) { break; } else { //交换 arr[lo] 和 arr[hi] 的值 temp = arr[lo]; arr[lo] = arr[hi]; arr[hi] = temp; // lo 和 hi 都向前移动一个位置,准备继续遍历 lo++; hi--; } } //交换 arr[lo] 和 arr[q] 的值 temp = arr[lo]; arr[lo] = pivot; arr[q] = temp; //返回中间值所在序列中的位置 return lo; } void quick_sort(int* arr, int p, int q) { int par; //如果待排序序列不存在,或者仅包含 1 个元素,则不再进行分割 if (q - p <= 0) { return; } else { //调用 partition() 函数,分割 [p,q] 区域 par = partition(arr, p, q); //以 [p,par-1]作为新的待排序序列,继续分割 quick_sort(arr, p, par - 1); //以[par+1,q]作为新的待排序序列,继续分割 quick_sort(arr, par + 1, q); } } int main() { int i = 0; int arr[10] = { 35,33,42,10,14,19,27,44,26,31 }; //对于 arr 数组中所有元素进行快速排序 quick_sort(arr, 0, 9); for (; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
public class Demo { public static int partition(int[] arr, int p, int q) { int temp = 0; // lo、hi分别表示指向首个元素和倒数第 2 个元素的指针 int lo = p; int hi = q - 1; // pivot 表示选中的中间值 int pivot = arr[q]; while (true) { // lo从左往右遍历,直至找到一个不小于 pivot 的元素 while (arr[lo] < pivot) { lo++; } // hi从右往左遍历,直至找到一个不大于 pivot 的元素 while (hi > 0 && arr[hi] > pivot) { hi--; } // 如果 lo≥hi,退出循环 if (lo >= hi) { break; } else { // 交换 arr[lo] 和 arr[hi] 的值 temp = arr[lo]; arr[lo] = arr[hi]; arr[hi] = temp; // lo 和 hi 都向前移动一个位置,准备继续遍历 lo++; hi--; } } // 交换 arr[lo] 和 arr[q] 的值 temp = arr[lo]; arr[lo] = pivot; arr[q] = temp; // 返回中间值所在序列中的位置 return lo; } public static void quick_sort(int[] arr, int p, int q) { //如果待排序序列不存在,或者仅包含 1 个元素,则不再进行分割 if (q - p <= 0) { return; } else { //调用 partition() 函数,分割 [p,q] 区域 int par = partition(arr, p, q); //以 [p,par-1]作为新的待排序序列,继续分割 quick_sort(arr, p, par - 1); //以[par+1,q]作为新的待排序序列,继续分割 quick_sort(arr, par + 1, q); } } public static void main(String[] args) { int[] arr = new int[] { 35, 33, 42, 10, 14, 19, 27, 44, 26, 31 }; // 对于 arr 数组中所有元素进行快速排序 quick_sort(arr, 0, 9); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } } }
def partition(arr,p,q): #lo、hi分别表示指向首个元素和倒数第 2 个元素的索引 lo = p hi = q-1 #pivot 表示选中的中间值 pivot = arr[q] while True: #lo从左往右遍历,直至找到一个不小于 pivot 的元素 while arr[lo] < pivot: lo = lo + 1 #hi从右往左遍历,直至找到一个不大于 pivot 的元素 while hi > 0 and arr[hi] > pivot: hi = hi - 1 #如果 lo≥hi,退出循环 if lo >= hi: break else: #交换 arr[lo] 和 arr[hi] 的值 arr[lo],arr[hi] = arr[hi],arr[lo] #lo 和 hi 都向前移动一个位置,准备继续遍历 lo = lo + 1 hi = hi - 1 #交换 arr[lo] 和 arr[q] 的值 arr[lo],arr[q] = arr[q],arr[lo] #返回中间值所在序列中的位置 return lo def quick_sort(arr,p,q): #如果待排序序列不存在,或者仅包含 1 个元素,则不再进行分割 if q - p <= 0: return #调用 partition() 函数,分割 [p,q] 区域 par = partition(arr,p,q) #以 [p,par-1]作为新的待排序序列,继续分割 quick_sort(arr,p,par-1) #以[par+1,q]作为新的待排序序列,继续分割 quick_sort(arr,par+1,q) arr=[35,33,42,10,14,19,27,44,26,31] #对于 arr 列表中所有元素进行快速排序 quick_sort(arr,0,9) print(arr)
10 14 19 26 27 31 33 35 42 44
本文链接:http://task.lmcjl.com/news/12591.html