Java快速排序

算法步骤
  1. 从数列中挑出一个元素,称为 “基准”(pivot)
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

代码实现

调用quickSort方法,将数组,数组首位序列,数组末尾序列传入该方法

 public int[] sort(int[] sourceArray) throws Exception {
  //对 arr 进行拷贝,不改变参数内容
  int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
  
  return quickSort(arr, 0, arr.length - 1);
 }

不停的迭代partition方法,直至分区长度为1

 private int[] quickSort(int[] arr, int left, int right) {
  if(left < right) {
   int partitionIndex = partition(arr, left, right);
   quickSort(arr, left, partitionIndex - 1);
   quickSort(arr, partitionIndex + 1,right);
  }
  return arr;
 }

在arr数组中,以left为基准值,right为分区排序的长度,将小于left的数值放在其左侧,大于left的数值放在其右侧

 private int partition(int[] arr, int left, int right) {
  //设定基准值(pivot)
  int pivot = left;
  int index = pivot + 1;
  for(int i = index; i<=right; i++) {
   if(arr[i] < arr[pivot]) {
    swap(arr, i, index);
    index++;
   }
  }
  swap(arr, pivot, index - 1);
  return index - 1;
 }

将数组arr中,序列为i和序列为j的两个数交换

 private 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) throws Exception {
  int[] arr = {50,15,56,23,54,84,58,45,21};
  
  QuickSort qs = new QuickSort();
  int[] result = qs.sort(arr);
  
  System.out.print("排序后的数组为:");
  for(int num:result) {
   System.out.print(num+" ");
  }
 }
参考

https://www.runoob.com/w3cnote/quick-sort-2.html 菜鸟教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java快速排序的实现可以使用递归的方式来实现。快速排序的基本思想是选取一个基准元素,然后将数组中小于基准元素的数放在左边,大于基准元素的数放在右边,再对左右两个子数组分别进行快速排序,直到整个数组有序为止。 下面是Java快速排序的示例代码: ```java public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } } public static int partition(int[] arr, int left, int right) { int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } public 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, 4, 3, 2, 1}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5] } } ``` 在上面的代码中,`quickSort()` 方法调用了 `partition()` 方法来选取基准元素并进行分区,然后再递归调用 `quickSort()` 方法对左右两个子数组进行快速排序。`partition()` 方法中使用了双指针来确定小于基准元素和大于基准元素的分界点,并将小于基准元素的数放在左边,大于基准元素的数放在右边。最后,将基准元素和分界点的数交换位置,并返回分界点的位置。 运行结果为 `[1, 2, 3, 4, 5]`,说明快速排序算法成功地对数组进行了排序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值