快速排序,采用递归实现

递归实现快速排序

一趟快速排序主要步骤如下:
(1) 设置两个变量,l、r,初始变量分别为left和right,表示待排序列的其实下标和终止下标。
(2)将第l个记录暂时存在变量pivot中,这个记录可以随意选取,相当于基准值,pivot=arr[l]。
(3) 从下标为r的位置向前搜索,当找到比基准值小的数时,将其移动到下标为l的位置上,同时l=l+1
(4) 从下标为l的位置向后搜索,当找到比基准值大的数时,将其移动到下标为r的位置上,同时r=r-1
(5)重复(3)(4)的步骤,直到l==r时停止搜索
(6)支点记录到位 arr[l]=pivot
第一次快排之后的结果为[25,39,8] ,52,[70,95,67,52]
(7) 使用递归

package it_01_digui;

public class quickSortArr {
    public static void main(String[] args) {
        int[] arr={52,39,67,95,70,8,25,52};

        partition(arr,0,arr.length-1);
//        Quicksort(arr,0,arr.length-1);
        for (int i : arr) {
            System.out.print(i+" ");
        }

    }

    public static void partition(int[] arr,int left,int right){

        //基线条件
        if (left<right) {
            int l=left;
            int r=right;
            int pivot=arr[l];//第一个作为致电记录
            while (l<r){    //从表的两端交替地向中间扫描
                while (l<r&&pivot<=arr[r]){
                    r--;
                }
                if (l<r){
                    arr[l]=arr[r];//将比支点小的向前移动
                    l++;
                }
                while (l<r&&pivot>arr[l]){
                    l++;
                }
                if (l<r){
                    arr[r]=arr[l];//将比支点大的向后移动
                    r--;
                }
            }
            arr[l]=pivot;//支点记录到位
            //递归
            partition(arr,left,l-1);
            partition(arr,l+1,right);
        }

    }

    private static void Quicksort(int arr[], int l, int r)
    {
        if(l<r)
        {
            int l1=l,r1=r;
            int z=arr[l];
            while(l1<r1)
            {
                while(arr[r1]>=z&&l1<r1) r1--;
                arr[l1]=arr[r1];
                while(arr[l1]<z&&l1<r1) l1++;
                arr[r1]=arr[l1];
            }
            arr[r1]=z;
            Quicksort(arr,l,r1-1);
            Quicksort(arr,r1+1,r);
        }
    }

//    private void qSort(int[] arr,int left,int right){
//        if (left<right){
//            int pivotLoc=partition(arr,left,right);
//            qSort(arr,left,pivotLoc-1);
//            qSort(arr,pivotLoc,right);
//        }
//    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值