java实现快速排序法

快速排序是一种冒泡排序,只是把将要排序的数据分成了两组,然后通过冒泡排序进行排序,然后左边的数通过递归再次排序,右边也一样通过递归两次排序,最后得到结果。

图解:
在这里插入图片描述
在这里插入图片描述

package com.demo.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class QuickSort {
    public static void main(String[] args) {
//        int[] arr={-9,78,0,23,-567,70};
        int[] arr=new int[8];
        for (int i = 0; i < arr.length; i++) {
        arr[i]=(int)(Math.random()*10);

        }

        Date date=new Date(  );
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YY-MM-DD-HH:MM:SS");
        String format = simpleDateFormat.format( date );
        System.out.println( "测试前的时间是" + format );

        quickSort( arr,0,arr.length-1 );//注意是arr.length-1不是arr.length
        Date date1=new Date(  );
        String format1 = simpleDateFormat.format( date1 );
        System.out.println( "排序后的时间是"+format1 );


     System.out.println( Arrays.toString( arr ) );
    }

    public static void quickSort(int[] arr,int left,int right){
        int l=left;
        int r=right;
        /*中轴值*/
        int pivot=arr[(left+right)/2];
//        循环把比pivot小的值放到pivot左边,大的放到右边
        while(l<r){

//            从左边开始找,直到找到比pivot的大的值才退出
            while(arr[l]<pivot){
                l++;
            }
//            从右边开始找,直到找到比小的值才退出
            while(arr[r]>pivot){
                r--;
            }

            int temp=0;//用来把两个数交换位置
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
//说明已经比较完毕,可以退出

            if(l>=r){
                break;

            }
//    如果交换完后发现这个arr[l]==pivot,则l往右偏移
            if(arr[l]==pivot){
               r--;
            }
            if (arr[r]==pivot){

              l++;
            }



        }

//        左右的两边的数已经分组,可以继续左边,右边的数排序
//            l==r也满足条件,所以必须让它们执行下面的条件
//    !!!小心    没有加上这个会出现
  /*      Exception in thread "main" java.lang.StackOverflowError
        at com.demo.sort.QuickSort.quickSort(QuickSort.java:54)*/
        if(l==r){

            l++;
            r--;

        }


//            此时只是分成了左右两边的数,但是左右的数并没有排序好
//            递归排序左边的数和右边的数


//这个r已经找出了的的
        if(left<r){

            quickSort( arr,left,r );

        }
        if(right>l){

            quickSort( arr,l,right);
        }


    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有时间指导毕业设计

觉得写的好的话可以给我打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值