首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解快速排序算法

如何理解快速排序算法
EN

Stack Overflow用户
提问于 2013-06-20 08:29:37
回答 3查看 248关注 0票数 0

根据我所掌握的材料,我正在用java学习快速排序。最好的情况是枢轴是中间的,最坏的情况是枢轴的一侧总是空的。

对于下面的代码,是"indexPartition“枢轴?,您在下面的函数中放置了什么样的参数,以便在最坏的情况下运行?

代码语言:javascript
复制
    private void quickSortSegment(E[] list, int start, int end)
{
  if (end-start>1) 
  { 
     int indexPartition = partition(list, start, end);
     quickSortSegment(list, start, indexPartition);
     quickSortSegment(list, indexPartition+1, end);
  }
}

private int partition(E[] list, int start, int end)
{
  E temp; 
  E partitionElement = list[start];
  int leftIndex = start; 
  int rightIndex = end-1;
  while (leftIndex<rightIndex)
  {  
    while (list[leftIndex].compareTo(partitionElement) <= 0 && leftIndex<rightIndex)
    {
        leftIndex++; 
    }
    while (list[rightIndex].compareTo(partitionElement) > 0)
    {
        rightIndex--; 
    }
     if (leftIndex<rightIndex)
     {  
        temp = list[leftIndex];
        list[leftIndex] = list[rightIndex];
        list[rightIndex] = temp;
     }
  }
  list[start] = list[rightIndex];
  list[rightIndex] = partitionElement;
  return rightIndex;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-20 08:33:00

不,枢轴是partitionElement。这段代码似乎总是选择序列中的第一个元素作为支点。该函数在所有情况下都会运行,包括最坏的情况,但是它的性能会很差(具有平方复杂性)。

不同的人对于选择支点提出了不同的解决方案,但我个人喜欢这个方案:从考虑的区间中选择3个随机元素,计算它们的平均值,并以此作为支点。

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 09:08:42

这段视频连同维基百科的文章应该会澄清一些事情。维基百科在解释排序算法方面非常棒。关于您的问题,indexPartitionrightIndex,它是partitionElement的索引,是支点。

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 10:07:10

这个方法分区()有什么问题,例如,对于{3,1,2},我们将得到{1,3,2}:

代码语言:javascript
复制
public class CompareApp {
public static void main(String... args) {
    Integer[] arr = {3, 1, 2};
    quickSortSegment(arr, 0, 2);
    for (Integer i : arr) System.out.println(i);
}

private static <E extends Comparable> void quickSortSegment(E[] list, int start, int end) {
    if (end - start > 1) {
        int indexPartition = partition(list, start, end);
        quickSortSegment(list, start, indexPartition);
        quickSortSegment(list, indexPartition + 1, end);
    }
}


private static <E extends Comparable> int partition(E[] list, int start, int end) {
    E temp;
    E partitionElement = list[start];
    int leftIndex = start;
    int rightIndex = end - 1;
    while (leftIndex < rightIndex) {
        while (list[leftIndex].compareTo(partitionElement) <= 0 && leftIndex < rightIndex) {
            leftIndex++;
        }
        while (list[rightIndex].compareTo(partitionElement) > 0) {
            rightIndex--;
        }
        if (leftIndex < rightIndex) {
            temp = list[leftIndex];
            list[leftIndex] = list[rightIndex];
            list[rightIndex] = temp;
        }
    }
    list[start] = list[rightIndex];
    list[rightIndex] = partitionElement;
    return rightIndex;
}}

java system.compare.CompareApp

1 3 2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17208816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档