Java使用分治递归的思想实现快速排序

最近想探究一下算法方面的问题,闲着无聊就撸了一波快排的代码,以前都是直接拿过来用的,但是想想毕竟那是别人的东西,只有自己学会才算自己的,思路其实不难,只是需要好的处理一些细节问题,下面来说说思路和代码实现。

基本思路:

 * 1、定义一个函数找出基准值temp。

 *    (1)找基准的函数中:定义一个头指针,尾指针,头指针指向数组的第一个元素,尾指针指向数组的最后一个元素。
 *    (2)在头指针指向的位置小于尾指针的情况下: 尾指针对数组从右至左找小于temp值的位置,然后将该位置上的元素值与头指针指定的位置上的元素值进行交换。
 *    (3)在头指针指向的位置小于尾指针的情况下: 头指针对数组从左至右找大于temp值的位置,然后将改位置上的元素值与尾指针指定的位置上的元素值进行交换。
 *    (4)循环执行(1)(2)直到头指针指向的位置等于尾指针指向的位置时,返回头指针指向的位置(也就是基准的位置值)。
 * 2、利用分治思想,将原问题划分成多个子问题,也就是通过基准将数组一分为二,再对数组arr[0 ~ temp-1]和数组arr[temp+1 ~ arr.lengh-1]进行排序。
 * 3、利用递归的思想,排序时也按照步骤1执行,然后继续划分,继续排序,一直递归,直到只有一个元素为止。
 *          PS:(程序中递归传入的参数是要排列数值的第一个值left和最后一个值right,所以当数组中只有一个元素的时候,即left=right)
 *
 * 实例说明:数组的初始序列为 : 4 3
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的分治算法实现快速排序的步骤如下: 1. 选择一个基准元素(pivot),可以是数组中的任意一个元素。 2. 将数组分成两部分,小于等于基准元素的放在左边,大于基准元素的放在右边。 3. 对左右两部分分别进行递归调用快速排序算法,直到每个部分只有一个元素或为空。 4. 合并左右两部分,得到最终排序结果。 下面是Java代码实现快速排序的示例: ```java public class QuickSort { 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); // 对右侧子数组进行快速排序 } } private static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择第一个元素作为基准元素 int i = low + 1; // 左指针 int j = high; // 右指针 while (i <= j) { if (arr[i] <= pivot) { i++; } else if (arr[j] > pivot) { j--; } else { swap(arr, i, j); // 交换左右指针所指向的元素 } } swap(arr, low, j); // 将基准元素放到正确的位置上 return j; // 返回基准元素的位置 } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {5, 2, 9, 1, 7, 6, 3}; quickSort(arr, 0, arr.length - 1); for (int num : arr) { System.out.print(num + " "); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值