算法-快速排序

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的

其原理如下:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中的所有记录均有序为止。

所谓的快速排序的思想就是:首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j–,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值都会跑到这个key的后面,不是的话就可能你写错了,小于这个key的就会跑到这个值的前面;然后我们对这个分段的数组再时行递归调用就可以完成整个数组的排序。
这里写图片描述

这样就以key分为了两个段,我们把这两个段再递进去就可以解决问题了

package ch09;
/*
 * 快速排序
 */
public class QuickSort {
     /**
      * 划分数组
      */
     public static int partition(long arr[],int left, int right,long point) {
           int leftPtr = left - 1;
           int rightPtr = right;
           while(true) {
                //循环,将比关键字小的留在左端
                while(leftPtr < rightPtr && arr[++leftPtr] < point);
                //循环,将比关键字大的留在右端
                while(rightPtr > leftPtr && arr[--rightPtr] > point);
                if(leftPtr >= rightPtr) {
                     break;
                } else {
                     long tmp = arr[leftPtr];
                     arr[leftPtr] =  arr[rightPtr];
                     arr[rightPtr] = tmp;
                }
           }
           //将关键字和当前leftPtr所指的这一个进行交换
           long tmp = arr[leftPtr];
           arr[leftPtr] =  arr[right];
           arr[right] = tmp;
           return leftPtr;
     }
     
     public static void displayArr(long[] arr) {
           System.out.print("[");
           for(long num : arr) {
                System.out.print(num + " ");
           }
           System.out.print("]");
           System.out.println();
     }
     
     public static void sort(long[] arr, int left, int right) {
           if(right - left <= 0) {
                return;
           } else {
                //设置关键字
                long point = arr[right];
                //获得切入点,同时对数组进行划分
                int partition = partition(arr, left, right, point);
                //对左边的子数组进行快速排序
                sort(arr,left,partition - 1);
                //对右边的子数组进行快速排序
                sort(arr,partition + 1, right);
           }
     }
}

package ch09;
public class TestQuickSort {
     public static void main(String[] args) {
           long[] arr  = new long[10];
           for(int i = 0; i < 10;i++) {
                arr[i] = (long) (Math.random() * 99);
           }
           
           QuickSort.displayArr(arr);
           
           QuickSort.sort(arr, 0, arr.length - 1);
           
           QuickSort.displayArr(arr);
     }
}

微信公众号【码农园区】,技术分享,值得关注

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦之归途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值