快速排序算法

快速排序思路:

    通过将数组层层分组,当每组数据都有序后,整体数据也实现了有序。

    首先选择一个基准数base,其次生成左右两个指针i,j,然后左右指针开始向对方移动,左指针在移动过程中寻找大于基准数的数据,而右指针寻找小于基准数的数据,当左右指针指向的数据符合要求时指针停止。当两个指针尚未相遇,并都停止后交换指针指向的数据。然后指针继续移动直至左右指针相遇,接着指针共同指向的数据和基准数数据交换位置。这样,在当前基准数左右两侧分为了两组,左侧数据都小于基准数,而右侧数据都大于基准数。最后对左右两侧数据继续进行排序,直到实现整体有序。

public class test_快速排序 {
    public static void main(String[] args) {

    }
    public static void quickSort(int[] arr,int left,int right){
        //选择最左边的作为基准数
        int base = arr[left];
        int i = left; //i为左指针 为数组最左端
        int j = right;//j为右指针 为数组最右端
//如果左指针i和右指针j还未相遇
        while(i!=j){
            //右指针开始从数组最右端开始寻找比基准数小的数字。如果不比基准数小,则指针向左移动一位
            while(arr[j]>= base&&i<j){
                j--;
            }
            //左指针开始从数组最左端开始寻找比基准数大的数字。如果不比基准数大,则指针向右移动一位
            while(arr[i]<=base&&i<j){
                i++;
            }
            //当代码运行到这里,右指针指向一个比基准数小的数组,左指针也指向了一个比基准数大的数字。则两个指针指向的数字
            //交换位置
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;

        }
        //执行到这里,则左指针和右指针相遇。另基准数和左指针与右指针共同指向的数字交换位置
        arr[left] = arr[i];
        arr[i] = base;

        //第一遍循环完成,则原数组分为了数组起始位置到左右指针共同指向的数字 和 数组末尾位置到左右指针共同指向的数字两部分
        //此时基准数在这里 左边的数字都比他小,而右边的数字都比他大
        //然后数组起始 到 左右指针共同指向的前一位 继续开始排序
        quickSort(arr,left,i-1);
        //左右指针共同指向的后一位到数组末尾位置 也继续开始排序
        quickSort(arr,j+1,right);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值