PTA 1045 快速排序 一直AC不了

大佬们帮忙一起看看。咱们JAVA太吃亏了,我这是和C语言AC的代码差不多的思路。

public class Pta_1045 {
    public static void main(String[] args) throws IOException {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        int time = Integer.parseInt(buf.readLine());
        long[] longs = new long[time];//原数组
        long[] longs2 = new long[time];//复制数组
        List<Long> list = new ArrayList<>();
        String[] s = buf.readLine().split("\\s");
        for (int i = 0; i < time; i++) {
            longs[i] = Long.parseLong(s[i]);
        }
        longs2 = Arrays.copyOf(longs, time);
        Arrays.sort(longs2);
//        System.out.println(Arrays.toString(longs));
//        System.out.println(Arrays.toString(longs2));
        int num = 0;
        for (int i = 0; i < longs.length; i++) {
            long max = 0;
            if (longs2[i] == longs[i] && longs[i] > max) {//下标不动
                num++;
                list.add(longs[i]);
            }
            if (longs[i] > max) {
                max = longs[i];
            }
        }

//        System.out.println(Arrays.toString(a));
        Collections.sort(list);
        System.out.println(num);
        for (int i=0;i<list.size();i++){
            System.out.print(list.get(i));
            if(i!=list.size()-1){
                System.out.print(" ");
            }
        }
        System.out.println("");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用 Java 实现快速排序的示例代码: ``` public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } } private static int partition(int[] arr, int left, int right) { int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {4, 6, 2, 9, 1, 5, 8, 3, 7}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } } ``` 在这个示例中,我们使用了经典的 Lomuto 分区方案,也可以使用 Hoare 分区方案或其他方法。快速排序的时间复杂度为 O(nlogn),空间复杂度为 O(logn)。 ### 回答2: 快速排序是一种常用的排序算法,其基本思想是通过分治的方式将待排序的数组分成两部分,一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素,然后递归地对这两部分进行排序,最终得到一个有序的数组。 在快速排序中,首先需要选择一个基准元素,一般选择数组的第一个元素。接下来,需要定义两个指针i和j,分别指向数组的起始位置和末尾位置。然后,通过不断地移动指针i和j,将数组中比基准元素小的元素移到基准元素的左边,大于等于基准元素的元素移动到基准元素的右边。最后,将基准元素放到合适的位置,以使得左半边的元素都小于等于基准元素,右半边的元素都大于等于基准元素。 接着,使用递归的方式对基准元素左边和右边的子数组进行排序,直到全部的子数组长度为1或者0时终止递归。最终,当递归返回时,整个数组就变为有序的。 快速排序的时间复杂度为O(nlogn),其中n是待排序数组的大小。虽然其最坏情况下的时间复杂度为O(n^2),但是在大部分情况下,快速排序的效率非常高。 在Java中实现快速排序可以通过以下代码实现: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivotIndex = partition(arr, low, high); // 获取基准元素的位置 quickSort(arr, low, pivotIndex - 1); // 对基准元素的左边子数组进行排序 quickSort(arr, pivotIndex + 1, high); // 对基准元素的右边子数组进行排序 } } public static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择数组第一个元素作为基准元素 int i = low, j = high; while (i < j) { // 从右往左找到第一个小于基准元素的元素 while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i] = arr[j]; // 将小于基准元素的元素移到左边 i++; } // 从左往右找到第一个大于基准元素的元素 while (i < j && arr[i] <= pivot) { i++; } if (i < j) { arr[j] = arr[i]; // 将大于基准元素的元素移到右边 j--; } } arr[i] = pivot; // 将基准元素放到合适的位置 return i; // 返回基准元素的位置 } public static void main(String[] args) { int[] arr = {5, 3, 8, 6, 2, 7, 1, 4}; // 待排序的数组 int len = arr.length; quickSort(arr, 0, len-1); // 调用快速排序函数 System.out.println("排序后的数组:"); for (int i = 0; i < len; i++) { System.out.print(arr[i] + " "); } } } ``` 以上就是使用Java实现快速排序的代码。该代码首先定义了`QuickSort`类,其中包含了两个函数`quickSort`和`partition`。通过调用`quickSort`函数,传入待排序数组和起始位置和结束位置,即可完成快速排序。最后,输出排序后的数组结果。 ### 回答3: 快速排序(Quick Sort)是一种常用的排序算法,它的实现思想是通过分治法将一个大问题分解为若干个小问题进行处理,最终将这些小问题的解合并起来得到整体的解。 在 Java 中实现快速排序需要用到递归和分治的技巧。具体步骤如下: 1. 在选择用来划分子数组的元素时,我们通常选择一个称为“枢纽元”的值。一种常见的选择方法是选择子数组的第一个元素作为枢纽元。 2. 然后,我们将数组划分为两个子数组,将小于或等于枢纽元的元素放在左侧子数组中,将大于枢纽元的元素放在右侧子数组中。 3. 在划分子数组后,我们对左侧子数组和右侧子数组分别递归地应用快速排序算法,直到子数组的大小为1或0时停止递归。 4. 最后,将所有子数组按照顺序合并起来,得到已排序的整个数组。 下面是一个简单的使用 Java 实现快速排序的代码示例: ```java public class QuickSort { public static void quickSort(int[] array, int start, int end) { if (start < end) { int pivotIndex = partition(array, start, end); quickSort(array, start, pivotIndex - 1); quickSort(array, pivotIndex + 1, end); } } private static int partition(int[] array, int start, int end) { int pivot = array[start]; int i = start + 1; for (int j = start + 1; j <= end; j++) { if (array[j] < pivot) { swap(array, i, j); i++; } } swap(array, start, i - 1); return i - 1; } private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String[] args) { int[] array = {5, 2, 9, 1, 7, 6, 3}; quickSort(array, 0, array.length - 1); System.out.println(Arrays.toString(array)); } } ``` 以上就是使用 Java 实现快速排序的基本步骤和一个简单的代码示例。快速排序的平均时间复杂度为 O(nlogn),但在最坏情况下可能会达到 O(n²)。它是一种高效的排序算法,在实际应用中非常常见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值