21xrx.com
2024-05-10 02:00:09 Friday
登录
文章检索 我的文章 写文章
Java快速排序的两种方法
2023-11-04 07:52:18 深夜i     --     --
Java 快速排序 方法 排序算法

Java快速排序是一种高效的排序算法,常用于对大量数据进行排序。它的核心思想是通过将一个数组分割成较小的子数组,并对每个子数组进行排序,最终将这些子数组合并成一个有序的数组。快速排序有两种常用的实现方法:递归实现和非递归实现。

递归实现是最常见的实现方法之一。它的实现思路是选择数组中的一个元素作为基准元素,将比基准元素小的所有元素放在基准元素的左边,将比基准元素大的所有元素放在基准元素的右边,然后对左右两个子数组分别进行递归排序,最后将左右子数组和基准元素按顺序合并起来。递归实现的代码如下:


public static void quickSort(int[] arr, int low, int high){

  if(low < high){

   int pivot = partition(arr, low, high);

   quickSort(arr, low, pivot - 1);

   quickSort(arr, pivot + 1, high);

  }

}

public static int partition(int[] arr, int low, int high){

  int pivot = arr[low];

  while(low < high){

   while(low < high && arr[high] >= pivot)

     high--;

   

   arr[low] = arr[high];

   while(low < high && arr[low] <= pivot){

     low++;

   }

   arr[high] = arr[low];

  }

  arr[low] = pivot;

  return low;

}

非递归实现是将递归实现转化为循环实现的一种方法。它使用一个栈来存储待排序子数组的起始和结束位置,实现起来比递归实现更加复杂。其思路是将整个数组分割成多个较小的子数组,然后依次对每个子数组进行排序,最后将所有子数组按顺序合并起来。非递归实现的代码如下:


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();

   int pivot = partition(arr, low, high);

   if(pivot - 1 > low){

     stack.push(low);

     stack.push(pivot - 1);

   }

   if(pivot + 1 < high){

     stack.push(pivot + 1);

     stack.push(high);

   }

  }

}

public static int partition(int[] arr, int low, int high){

  int pivot = arr[low];

  while(low < high){

   while(low < high && arr[high] >= pivot)

     high--;

   

   arr[low] = arr[high];

   while(low < high && arr[low] <= pivot){

     low++;

   }

   arr[high] = arr[low];

  }

  arr[low] = pivot;

  return low;

}

无论是递归实现还是非递归实现,Java快速排序都是一种快速高效的排序算法。它的时间复杂度为O(nlogn),并且在平均情况下具有较好的性能。因此,使用Java快速排序可以提高程序的执行效率,适用于对大量数据进行排序的场景。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复