随机化快速排序

21 篇文章 1 订阅

随机化快速排序

题目描述

使用Java或C++等语言中内置的随机函数实现随机化快速排序,在数组中随机选择一个元素作为分区的主元(Pivot)。

输入

多组样例输入,每组由一个一维整型数组组成。

输出

随机化快速排序之后的一维整型数组(升序排列)。

样例输入
6 1 8 6 5 3 4
5 12 42 2 5 8
样例输出
1 3 4 5 6 8
2 5 8 12 42
Code
package Week7;
import java.util.Scanner;
//随即快排,随机选一个数作为第一个。
//p =  (int) (p +1+ Math.random() * (q- p + 1));
public class QE {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num;
        while(sc.hasNext()){
            num = sc.nextInt();
            int[] arr = new int[num];
            //输入长度为num的数组
            for(int i=0;i<arr.length;i++){
                arr[i] = sc.nextInt();
            }
            int[] result = quickSort(arr,0,num-1);
            //System.out.println(result);
            for(int i=0;i<result.length;i++){
                System.out.print(result[i]+" ");
            }
        }
    }
    //先写一个交换函数
    public static void swap(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    //再来写一个分区函数
    public static int partition(int[] arr,int p,int q){
        //p为起点坐标,q为终点坐标

       int y= (int) (p + Math.random() * (q- p + 1));
        //把p和第一个换回来
        swap(arr,p,y);
        int x =arr[p];
        int i = p, j;
        //从起点后面一个数开始跟起点比较
        for(j = p + 1;j <= q; j++)
        {
            if(arr[j]<=x) {
                i++;
                //如果比起点小,就和起点交换
                swap(arr,i,j);
            }
//            for(int i1=0;i1<arr.length;i1++){
//                System.out.print(arr[i1]);
//            }
//            System.out.println();
        }
        //交换完之后,改变起点
        swap(arr,p,i);
        //返回坐标

        return i;


    }
    //最后写一个小快排
    public static int[] quickSort(int[] arr, int p, int q)
    {
        //P<q时继续快排
        if(p < q)
        {
            //调用分区函数
            int r = partition(arr, p, q);
            //对分区后的左边进行快排
            quickSort(arr, p, r-1);
            //对分区后的右边进行快排
            quickSort(arr, r+1, q);
        }
        return arr;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值