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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值