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

如何理解或解释QuickSort中对partition的第一次调用?

彭英逸
2023-03-14

这包括https://stackoverflow.com/help/on-topic中的“软件算法”,或者在本例中是对一组数字进行排序的quicksort算法。

这里是我正在使用的quicksort算法代码(摘自破解编码面试第5版)

static void quickSort(int[] arr, int left, int right) {
    int index = partition(arr, left, right);
    if(left < index - 1) {
        //sort left half
        quickSort(arr, left, index - 1);
    }
    if(index < right) {
        //sort right half 
        quickSort(arr, index, right);
    }
}
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) {
            swap(arr, left, right);
            left ++;
            right --;
        }
    }
    return left;
}
static void swap(int arr[], int one, int two) {
    int temp = arr[one];
    arr[one] = arr[two];
    arr[two] = temp;
} 

我知道quicksort算法的一个总结是,所有小于枢轴的元素都在枢轴的左边,所有大于枢轴的元素都在枢轴的右边。顺便问一下,与pivot相同的元素应该去哪里有规则吗?

{10, 100, 300, 200, 1000, 20, 30}
[10, 100, 30, 20, 1000, 200, 300]

有人能帮我解释第一次调用Partition的结果吗?

共有1个答案

韦宏朗
2023-03-14

我想我的困惑是QuickSort的整个想法。如果还有人在为这件事而苦苦挣扎,我现在会这样解释。

int index = partition(arr, left, right);

 · · 和nbs将对数组进行关于枢轴的分区,在本例中,枢轴是索引。它保证左的一切都小于枢轴,而枢轴右的一切都大于枢轴。

现在我们看看这段代码

if(left < index - 1) {
    quickSort(arr, left, index - 1);
}
 if(index < right) {
        //sort right half 
        quickSort(arr, index, right);
    }
 类似资料:
  • 本文向大家介绍请解释下你对EventEmitter的理解相关面试题,主要包含被问及请解释下你对EventEmitter的理解时的应答技巧和注意事项,需要的朋友参考一下 EventEmitter是Node基于发布订阅模式实现的第三方库events EventEmitter多用于被继承,而并非直接使用 EventEmitter中实现了on、emit、once、off、listen等其他功能 当on中监

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 问题内容: 我有一个JSON对象流,就像通过TCP或WebSockets的JSON- RPC一样。没有长度前缀或定界符,因为JSON是自定界的。因此,当我从流中读取内容时,可能会遇到如下所示的结果: 我需要一个一个地解析每个JSON对象。我无法使用JSON.parse做到这一点,因为它只会在末尾抛出无关数据的语法错误。 当然,在这个示例中,我可以逐行进行,但是我不能依赖像这样的空白。JSON-RP

  • 我所知道的是: 注释是在java 5中添加的 注释可以在方法、类和属性中使用 注释可以在运行时、类、源代码中使用(我不知道如何使用类和源代码,以及它们的特性) 当java程序运行时,可以实现带有保留的注释,即运行时注释 我想实现一个注释,具有以下特性: > @MyAnnotation(allowMethods={xxx.doSomething}) public void getValue(){}

  • 在使用Tomcat时,我一直将视为或的等价物。似乎很自然,可能必须有某种方法来配置web服务器。 但是,我不太理解的用途。例如,在使用JDBC时,为什么必须在中添加,并在中添加包含更多信息的?我可以删除文件并在代码中实例化吗?我问是因为像这样的假设例子有助于我理解。 为什么我必须把这两个都放在那里才能使用JDBC?它们到底在做什么,除了在Java代码中,还有其他方法可以做同样的事情吗?就像我说的,

  • 问题内容: 我对此毫无疑问: 我以为是全部,但是后来我发现了以下片段: 这使。问题是我很难理解中的语法,有人可以解释它的工作原理吗? 问题答案: 难以理解的“嵌套”理解。循环以与理解相同的顺序展开。 这样有助于你进行思考。