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);
        }


    }


}

猜你喜欢

转载自blog.csdn.net/houzhicongone/article/details/114434112
今日推荐