当前位置: 首页 > 知识库问答 >
问题:

快速排序分区调整

司空祯
2023-03-14

但我想知道如何选择我希望的支点,例如在这个整数列表中,8、7、1、9、11、5、6,我希望选择键6作为我代码中的支点。或者我想选9或者其他什么。我怎样才能把它写进我的代码?非常感谢任何帮助。

package quicksort;

public class quicky {
    private static void quicksort(int[] arr, int left, int right) {
        int index = partition(arr, left, right);
    
        if(left < index - 1)
            quicksort(arr, left, index - 1);
        if(index < right)
            quicksort(arr, index, right);
    }
    private static int partition (int[] arr, int left, int right) {
        int pivot = arr[(left + right) / 2];
        while(left<= right) {
            while(arr[left] < pivot) left++;
            while(arr[right]> pivot) right--;
        
            if(left<= right) {
                int tmp = arr[left];
                arr[left] =arr[right];
                arr[right] = tmp;
            
                left++;
                right--;
            }
        }
        return left;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] array = new int [] { 8, 7, 1, 9, 11, 5, 6};
        quicksort(array, 0 , array.length-1);
        for(int i = 0; i <array.length; i++)
            System.out.print(array[i]+ " ");        
        }        
    }
}

共有2个答案

时宾实
2023-03-14

简单方法:

  1. 检查数组中是否存在值。
  2. 如果是,则将值与默认数据透视索引中的值交换。
  3. 继续使用相同的代码/lomuto分区。
佟阳飙
2023-03-14

在您的代码中

private static int partition (int[] arr, int left, int right) {
/*
Here in below code only you need to make your changes and that needs to be through out the same as you are calling this from quicksort also you need to make use of the left and right for that, as everytime you will be passing that otherwise it will be static value. 
*/        
int pivot = arr[(left + right) / 2];
        

        while(left<= right) {
            while(arr[left] < pivot) left++;
            while(arr[right]> pivot) right--;
        
            if(left<= right) {
                int tmp = arr[left];
                arr[left] =arr[right];
                arr[right] = tmp;
            
                left++;
                right--;
            }
        }
        return left;
    }

 类似资料:
  • 我正在学习快速排序在第四算法课程,罗伯特塞奇威克。 我想知道quicksort代码的以下分区是长度为n的数组中比较的个数。

  • 假设我们将Quicksort修改为有三个分区,而不是两个分区。左侧分区的值 pivot。然后我们对左分区和右分区进行递归。这个3路分区需要多少时间? 我在一个面试问题中看到了这一点,那里的答案是O(n)。但对于普通的1次快速排序,它是O(nlogn)。 请帮我弄明白为什么不是?

  • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两

  • 1. 前言 本节内容是排序算法系列之一:快速排序,主要讲解了快速排序的主体思路,选取了一个待排序的数字列表对快速排序算法进行了演示,给出了快速排序算法的 Java 代码实现,帮助大家可以更好地理解快速排序算法。 2. 什么是快速排序? 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序。 快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快

  • 本文向大家介绍快速排序和分治排序介绍,包括了快速排序和分治排序介绍的使用技巧和注意事项,需要的朋友参考一下 快速排序让我看了很久,也折磨了我很长时间,因为大体上的思路我是有了,但是写代码时总是出现各种问题,要想把它调试出来对我个人来说还是有一定难度的,而且因为工作和偷懒的原因,导致之前调试不出来的错误放了很久,今天终于出来啦,还是有些小激动的哦,下面来分享一下我的代码并做一点点说明。   要学会快

  • 5.12.快速排序 快速排序使用分而治之来获得与归并排序相同的优点,而不使用额外的存储。然而,作为权衡,有可能列表不能被分成两半。当这种情况发生时,我们将看到性能降低。 快速排序首先选择一个值,该值称为 枢轴值。虽然有很多不同的方法来选择枢轴值,我们将使用列表中的第一项。枢轴值的作用是帮助拆分列表。枢轴值属于最终排序列表(通常称为拆分点)的实际位置,将用于将列表划分为快速排序的后续调用。 Figu