小龙哥GT 2023-12-05 16:47 采纳率: 22.2%
浏览 2

Java,将快速排序改为随机快速排序

将下面的Java快速排序改为随机快速排序。

public class QuickSort {

    /*快速排序函数*/
    public static void quickSort(int[] arr, int left, int right) {
        
        //如果队首元素小于队尾元素
        if (left < right) {
            
            //定义基准数,记录队列的始末。
            int pivot = arr[left];
            int begin = left;
            int end = right;

            while (right > left) {

                //当队尾元素小于基准数就将队尾插到队首
                if (arr[right] < pivot) {
                    arr[left] = arr[right];
                    left++; //队首索引后移
                } 

                //当队尾元素大于基准数就将队尾索引前移,继续从队尾比较
                else {
                    right--;
                    continue;
                }

                while (right > left) {
                    
                    //当队首元素大于基准数就将队首插到队尾
                    if (arr[left] > pivot) {
                        arr[right] = arr[left];
                        right--;//队尾索引前移
                        break;
                    }

                    //当队首元素小于基准数就将队首索引后移,继续从队首比较
                    else {
                        left++;
                    }
                }
            }
            
            //队首和队尾索引重合,就将基准数插入此位置
            arr[left] = pivot;
 
            quickSort(arr, begin, left - 1);
            quickSort(arr, left + 1, end);
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {8, 45, 0, 30, 49, 16, 20, 20};
        
        //定义队首、队尾位置的索引
        int left = 0;
        int right = arr.length - 1;
        
        System.out.print("排序前的数组:");
        for (int i : arr)
            System.out.print(i+" ");
        System.out.println();
            
        quickSort(arr, left, right);
        
        System.out.print("排序后的数组:");
        for (int i : arr)
            System.out.print(i+" ");
    }
}

我也自己尝试了一下,但是输出的排序不对。

import java.util.Random;

public class RandomQuickSort {

    /* 随机快速排序函数 */
    public static void randomQuickSort(int[] arr, int left, int right) {
        
        // 如果队首元素小于队尾元素
        if (left < right) {
            
            // 随机选取基准数,记录队列的始末。
            int pivot = arr[left + new Random().nextInt(right - left + 1)];
            int begin = left;
            int end = right;

            while (right > left) {

                // 当队尾元素小于基准数就将队尾插到队首
                if (arr[right] < pivot) {
                    arr[left] = arr[right];
                    left++; // 队首索引后移
                } 

                // 当队尾元素大于基准数就将队尾索引前移,继续从队尾比较
                else {
                    right--;
                    continue;
                }

                while (right > left) {
                    
                    // 当队首元素大于基准数就将队首插到队尾
                    if (arr[left] > pivot) {
                        arr[right] = arr[left];
                        right--;// 队尾索引前移
                        break;
                    }

                    // 当队首元素小于基准数就将队首索引后移,继续从队首比较
                    else {
                        left++;
                    }
                }
            }
            
            // 队首和队尾索引重合,就将基准数插入此位置
            arr[left] = pivot;
 
            randomQuickSort(arr, begin, left - 1);
            randomQuickSort(arr, left + 1, end);
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {8, 45, 0, 30, 49, 16, 20, 20};
        
        // 定义队首、队尾位置的索引
        int left = 0;
        int right = arr.length - 1;
        
        System.out.print("排序前的数组:");
        for (int i : arr)
            System.out.print(i+" ");
        System.out.println();
        
        randomQuickSort(arr, left, right);
        
        System.out.print("排序后的数组:");
        for (int i : arr)
            System.out.print(i+" ");
    }
}
  • 写回答

2条回答 默认 最新

报告相同问题?

问题事件

  • 创建了问题 12月5日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题