首页 > 编程语言 > 详细

分治法-快速排序

时间:2019-05-23 16:52:26      阅读:107      评论:0      收藏:0      [点我收藏+]

算法思想:分治法
实际问题:快速排序
编写语言:Java


Java代码

//本篇博文代码主要有两种基准选择方式:基准=低下标处的值,基准=随机值
import java.util.Random;

public class QuickSort
{
    public static void main(String[] args)
    {
        int[] ary = new int[] {1, 3, 4, 5, 2, 7, 0, 6, 9, 8};

        System.out.print("排序前的数组:");
        for(int i = 0; i < ary.length; i++)
            System.out.print(ary[i] + " ");
        System.out.println();

        sort(ary);

        System.out.print("排序后的数组:");
        for(int i = 0; i < ary.length; i++)
            System.out.print(ary[i] + " ");
        System.out.println();
    }

    public static void sort(int[] a)
    {
        sort(a, 0, a.length - 1);
    }

    public static void sort(int[] a, int low, int high)
    {
        //当low == high时就返回
        //确保数组元素为1时就停止划分,防止数组下标越界
        if(low < high)
        {
            int pivot = randPart(a, low, high);
            sort(a, low, pivot - 1);
            sort(a, pivot + 1, high);
        }
    }

    //划分寻找基准
    public static int part(int[] a, int low, int high)
    {
        int pivot = a[low];

        while(low < high)
        {
            //1、从右往左找比基准小的数
            while(low < high && a[high] > pivot)
                high--;
            //a处赋值
            if(low < high)
                a[low] = a[high]; //此时是 a[high] < pivot, a[low] < pivot
            //2、从左往右找比基准大的数
            while(low < high && a[low] <= pivot)
                low++;
            //3、一次寻找结束,交换两个值
            //b处赋值
            if(low < high)
                a[high] = a[low]; //此时是 a[high] > pivot, a[low] < pivot
            //a、b两处赋值,相当于一次交换,只是分开了
        }

        //将pivot放到left和right相遇的地方
        a[high] = pivot;

        return high;
    }

    //划分寻找基准-随机化优化
    public static int randPart(int[] a, int low, int high)
    {
        Random r = new Random();
        //随机产生一个 low 到 high 的整数
        int flag = low + r.nextInt(high - low + 1);

        int pivot = a[flag];

        //此处交换保证 1 处的赋值不出错,
        //因为只要原 a[low] < pivot,那么这个交换算法就失败了
        a[flag] = a[low];
        a[low] = pivot;


        while(low < high)
        {
            //1、从右往左找比基准小的数
            while(low < high && a[high] > pivot)
                high--;
            if(low < high)
                a[low] = a[high];
            //2、从左往右找比基准大的数
            while(low < high && a[low] <= pivot)
                low++;
            if(low < high)
                a[high] = a[low];
        }

        //将pivot放到low和high相遇的地方
        a[high] = pivot;

        return high;
    }
}

运行结果

技术分享图片

分治法-快速排序

原文:https://www.cnblogs.com/wellcherish/p/10912841.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!