当前位置: 首页 > 面试题库 >

快速排序应用程序中这些交换代码行的用途是什么?

闻人冷勋
2023-03-14
问题内容

我试图了解quicksort的实现或应用程序以找到第k个最小元素这是我试图了解的代码

public int quicksort(int a[], int start, int end, int k) {
    if(start < end) {
        int pivot = partition(a, start, end);
        if(pivot == k -1) {
            return pivot;
        } else if(pivot > k - 1){
            return quicksort(a, start, pivot, k);
        } else {
            return quicksort(a, pivot + 1, end, k);
        }
    } else if(start == end) {
        return k==1?start:-1;
    } else {
        return -1;
    }
}
public int partition(int a[], int start, int end) {
    int pivot = start;
    int i = pivot + 1;
    int j = end;
    while(a[i] < a[pivot] && i < end) {
        i ++;
    } 
    while(a[j] > a[pivot] && j >= 0) {
        j --;
    } 
    if(i < j) {
        swap(a, start, end);
    }
    swap(a,j, pivot);
    return pivot;
}
private void swap(int a[], int swap1, int swap2) {
    int temp = a[swap1];
    a[swap1] = a[swap2];
    a[swap2] = temp;
}

我了解尝试查找第k个最小元素,因此要使用quicksort,因为枢轴左侧的元素将小于枢轴,而枢轴右侧的元素将大于。这样,如果您要查找第4个最小元素,并且枢轴位于索引3处,则可以返回它,因为您知道它是第4个最小元素,因为它比第3个元素小3个元素。

我在理解分区方法中的两个交换时遇到麻烦。

在第一个while循环结束时,索引i将位于所有小于枢轴的元素都位于i的左侧的位置。索引j将位于所有大于枢轴的元素都位于j右侧的位置。

分区内此交换代码的目的是什么?谁能举例说明为什么需要此代码?这些将如何相遇?

if(i < j) {
        swap(a, i, j);
}

而且对于此交换行(也在分区内),为什么作者交换数据透视表和j,而不是数据透视表和i?它是任意的吗?

        swap(a,j, pivot);

问题答案:

您可以使用存在于以下位置的分区算法:快速排序分区算法

您使用的算法返回错误的数据透视



 类似资料:
  • 本文向大家介绍Java迭代快速排序程序,包括了Java迭代快速排序程序的使用技巧和注意事项,需要的朋友参考一下 下面是用于迭代快速排序的Java程序 示例 输出结果 一个名为Demo的类包含3个函数,“swap”用于使用临时变量交换值,一个“partition”函数根据主元素值将数组分为两半,以及“quick_sort”函数,该函数使用主元素值并基于该值对数组中的值进行排序。 在main函数中,将

  • 本文向大家介绍java冒泡排序和快速排序代码,包括了java冒泡排序和快速排序代码的使用技巧和注意事项,需要的朋友参考一下 冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 快速排序: 算法:当数据量很大适宜采用该方法。采用二分

  • 本文向大家介绍比较排序之快速排序(实例代码),包括了比较排序之快速排序(实例代码)的使用技巧和注意事项,需要的朋友参考一下 快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在

  • 问题内容: 在我的Java应用程序中,我有此代码 当我为 android 2.3(第10级) 构建它时, 它可以编译并正常工作。但是,当我为 android 4.0(级别15) 构建它时,它会编译并在运行时崩溃并出现以下错误 当我评论这条线,并建立它工作正常,没有问题.. 所以我不明白为什么会这样,这段代码意味着什么? 问题答案: @Override public void onAttachedT

  • 我对python是全新的,我正在尝试在其中实现quicksort。有人能帮我完成我的代码吗? 我不知道如何连接这三个数组并打印它们。

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