Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 此快速排序实现的时间复杂性的最坏情况是否为O(n log n)?_Algorithm_Sorting_Big O_Quicksort - Fatal编程技术网

Algorithm 此快速排序实现的时间复杂性的最坏情况是否为O(n log n)?

Algorithm 此快速排序实现的时间复杂性的最坏情况是否为O(n log n)?,algorithm,sorting,big-o,quicksort,Algorithm,Sorting,Big O,Quicksort,我想说它最糟糕的时间复杂度仍然是n logn。因为我使用中间元素作为轴心,所以即使数组已经被排序,当它从分区方法返回时,它仍然将是数组的一半。我可能错了,我的DS不是最好的 public static void quicksort(int [] arr, int low, int high){ if(low < high){ int pivot = partition(arr, low, high); quicksort(arr, lo

我想说它最糟糕的时间复杂度仍然是n logn。因为我使用中间元素作为轴心,所以即使数组已经被排序,当它从分区方法返回时,它仍然将是数组的一半。我可能错了,我的DS不是最好的

 public static void quicksort(int [] arr, int low, int high){
      if(low < high){
          int pivot = partition(arr, low, high);
          quicksort(arr, low, pivot);
          quicksort(arr, pivot+1, high);
        }
    }

 public static int partition(int [] arr, int low, int high){
     
        int i = low; 
        int j = high;
        int mid = low + (high-low)/2;
        int pivot = arr[mid];
       
        while(true){
           while(arr[i] < pivot){
               i++;
           }
           while(arr[j] > pivot){
               j--;
           } 
            

        if( i >= j) return j;
            
        swap(arr, i, j);
        i++;
        j--;  
         
    }
 }
publicstaticvoidquicksort(int[]arr,int-low,int-high){
如果(低<高){
int pivot=分区(arr、低、高);
快速排序(arr、low、pivot);
快速排序(arr,轴+1,高);
}
}
公共静态int分区(int[]arr,int低,int高){
int i=低;
int j=高;
int mid=低+(高-低)/2;
int pivot=arr[mid];
while(true){
while(arr[i]pivot){
j--;
} 
如果(i>=j)返回j;
掉期(arr,i,j);
i++;
j--;
}
}

快速排序的最坏情况是,每次选择枢轴时,它都是数组中的最大或最小编号/值。 在这种情况下,对于常规版本的快速排序,它将以O(n^2)运行。
然而,有一个版本的快速排序使用分区算法来选择更好的枢轴。在此版本的快速排序中,最坏的情况是O(nlogn)。

快速排序的最坏情况是每次选择枢轴时,它都是数组中的最大或最小数/值。 在这种情况下,对于常规版本的快速排序,它将以O(n^2)运行。
然而,有一个版本的快速排序使用分区算法来选择更好的枢轴。在这个版本的快速排序中,最坏的情况是O(nlogn)。

本文给出了一种算法,对于满足某些“合理”要求并以确定性方式运行的任何快速排序实现,该算法会产生任意长的输入序列,导致算法以二次时间运行。因此,虽然使用中间值作为轴可以防止算法在已排序的数组上以二次时间运行是正确的,但轴的选择是确定的,这意味着算法会有一些输入导致性能下降,本文给出了一种算法,对于满足某些“合理”要求并以确定性方式运行的任何快速排序实现,该算法会生成任意长的输入序列,从而导致算法以二次时间运行。因此,虽然使用中间值作为轴可以防止算法在已排序的数组上以二次时间运行是正确的,但轴的选择是确定的,这意味着算法会有一些输入导致性能下降,链接的纸可以用来构造这样的病理输入。

提示:如果轴总是最大(或最小)的元素,会发生什么?最坏的情况是O(n^2)@我明白你的意思。再次感谢!通过选择轴作为第一个、中间和中间三个轴之间的中间值,可以避免这种情况last@HikmatFarhat这种方法降低了不良行为的可能性,但不能保证这一点。请参阅我链接的文章,以获取此类快速排序方法的示例或输入,该方法需要二次时间才能运行。提示:如果轴始终是最大(或最小)元素,会发生什么情况?最坏的情况是O(n^2)@我明白你的意思。再次感谢!通过选择轴作为第一个、中间和中间三个轴之间的中间值,可以避免这种情况last@HikmatFarhat这种方法降低了不良行为的可能性,但不能保证这一点。请参阅我链接的文章,以获取此类快速排序方法的示例或输入,该方法需要二次时间才能运行。这是为我准备的吗?顺便说一句,这张纸是thx。非常有趣的是,这也是对这个问题的回答,因为它表明任何简单的确定性快速排序轴心选择方案都可能失败。这是给我的吗?顺便说一句,这张纸是thx。非常有趣的是,这也是对这个问题的回答,因为它表明任何简单的确定性快速排序轴心选择方案都可能失败。