快速排序

快速排序介绍 

  快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

快速排序示意图

代码实现

package sort;

import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
//       int[] arr={-9,78,0,23,-567,70};
       int[] arr={-9,78,0,23,-567,70,-1,300,1234};
        quickSort(arr,0,arr.length-1);
        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];//中轴值
        int temp=0;//临时变量
        /*
        * while循环的目的是让pivot值小的放在左边
        * 比pivot大的放在右边
        * */
        while (l<r){
            //在privot的左边一直找,找到大于等于pivot值,才退出
            while(arr[l]<pivot){
                l+=1;
            }
            //在pivot的右边一直找,找到小于等于pivot的值,才退出
            while (arr[r]>pivot){
                r-=1;
            }
            //如果l>=r说明pivot左右两边的值,已经按照左边小于等于pivot,右边大于等于pivot
            if(l>=r){
                break;
            }
            //交换
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
            //如果交换完后,发现这个arr[r]==pivot,r--前移
            if(arr[l]==pivot){
                r-=1;
            }
            //如果交换完后,发现这个arr[r]==pivot,l++后移
            if(arr[r]==pivot){
                l+=1;
            }
        }
        //如果l==r,必须l++,r==,否则为出现栈溢出
        if(l==r){
            l+=1;
            r-=1;
            //向左递归
            if(left<r){
                quickSort(arr, left, r);
            }
            //向右递归
            if(right>l){
                quickSort(arr,l,right);
            }
        }
    }
}

运行结果

原文地址:https://www.cnblogs.com/ftx3q/p/15764149.html