Java快速排序的递归与非递归实现

avatar
作者
猴君
阅读量:0

Java中快速排序算法的递归和非递归实现都是常见的排序方法。下面分别给出两种实现方式的代码示例:

  1. 递归实现:
public class QuickSortRecursive {     public static void main(String[] args) {         int[] arr = {10, 7, 8, 9, 1, 5};         quickSort(arr, 0, arr.length - 1);         System.out.println(Arrays.toString(arr));     }      public static void quickSort(int[] arr, int low, int high) {         if (low< high) {             int pivotIndex = partition(arr, low, high);             quickSort(arr, low, pivotIndex - 1);             quickSort(arr, pivotIndex + 1, high);         }     }      public static int partition(int[] arr, int low, int high) {         int pivot = arr[high];         int i = low - 1;         for (int j = low; j< high; j++) {             if (arr[j] <= pivot) {                 i++;                 swap(arr, i, j);             }         }         swap(arr, i + 1, high);         return i + 1;     }      public static void swap(int[] arr, int i, int j) {         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;     } } 
  1. 非递归实现:
import java.util.Arrays; import java.util.Stack;  public class QuickSortNonRecursive {     public static void main(String[] args) {         int[] arr = {10, 7, 8, 9, 1, 5};         quickSort(arr);         System.out.println(Arrays.toString(arr));     }      public static void quickSort(int[] arr) {         Stack<Integer> stack = new Stack<>();         stack.push(0);         stack.push(arr.length - 1);          while (!stack.isEmpty()) {             int high = stack.pop();             int low = stack.pop();              if (low< high) {                 int pivotIndex = partition(arr, low, high);                 stack.push(low);                 stack.push(pivotIndex - 1);                 stack.push(pivotIndex + 1);                 stack.push(high);             }         }     }      public static int partition(int[] arr, int low, int high) {         int pivot = arr[high];         int i = low - 1;         for (int j = low; j< high; j++) {             if (arr[j] <= pivot) {                 i++;                 swap(arr, i, j);             }         }         swap(arr, i + 1, high);         return i + 1;     }      public static void swap(int[] arr, int i, int j) {         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;     } } 

这两个示例中,递归实现使用了函数调用栈来存储待处理的子数组的边界,而非递归实现使用了一个显式的栈来达到相同的目的。在实际应用中,选择哪种实现方式取决于特定问题和需求。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!