java - 使用插入排序修改快速排序

标签 java quicksort

所以我必须使用枢轴作为数组的中间元素来制作快速排序算法。我做的一切都很好。但现在它要求我修改快速排序算法,以便当任何子列表减少到少于 20 时,我使用插入排序对子列表进行排序。

我似乎已经成功了。它对数组进行了完美的编译和排序,但是我不确定我是否做对了,因为修改后的快速排序和普通快速排序之间的 CPU 时间差异并没有那么不同。我的不确定性在于递归方法 recQuickSortC,其中我有 ">= 20"语句。我不确定这是否是实现修改的正确方法,它可能完全错误,我所知道的是它正确排序。任何帮助都会很好,谢谢。

这是我修改后的快速排序算法:

public void quickSortC(T[] list, int length)
{
    recQuickSortC(list, 0, length - 1);
}//end quickSort

private void recQuickSortC(T[] list, int first, int last)
{
  if (first < last)
  {
      int pivotLocation = partitionA(list, first, last);
      if ((pivotLocation - 1) >= 20)
          recQuickSortC(list, first, pivotLocation - 1);
      else
          insertionSort(list,pivotLocation -1);

      if ((pivotLocation - 1) >= 20)
          recQuickSortC(list, pivotLocation + 1, last);
      else
          insertionSort(list, pivotLocation + 1);
  }
}//end recQuickSort

private int partitionA(T[] list, int first, int last)
{
    T pivot;

    int smallIndex;

    swap(list, first, (first + last) / 2);

    pivot = list[first];
    smallIndex = first;

    for (int index = first + 1; index <= last; index++)
    {
        if (list[index].compareTo(pivot) < 0)
        {
            smallIndex++;
            swap(list, smallIndex, index);
        }
    }

    swap(list, first, smallIndex);

    return smallIndex;
}//end partition


    public void insertionSort(T[] list, int length)
{
    for (int unsortedIndex = 1; unsortedIndex < length;
                                unsortedIndex++)
    {
        Comparable<T> compElem =
                  (Comparable<T>) list[unsortedIndex];

        if (compElem.compareTo(list[unsortedIndex - 1]) < 0)
        {
            T temp = list[unsortedIndex];

            int location = unsortedIndex;

            do
            {
                list[location] = list[location - 1];
                location--;
            }
            while (location > 0 &&
                   temp.compareTo(list[location - 1]) < 0);

            list[location] = (T) temp;
        }
    }
}//end insertionSort

如果您注意到方法旁边有一堆 A、B 和 C,因为我必须执行很多不同的快速排序算法。我输入了算法中使用的所有代码。如果您需要更多,请告诉我,谢谢。

最佳答案

这对我来说看起来非常好,尽管我不会测试枢轴距离是否最多为 20,而是重写快速排序方法来表示 if (last - first <= 20) { do insertion sort} else { do normal quicksort} 。这样,您只需编写一次检查,而不是为递归的每个“边”编写一次。

也就是说,您的基准测试可能实际上并没有给您提供良好的时间估计——也就是说,您的代码实际上可能比您想象的要快——只是因为在 Java 中获得准确的基准测试并不是微不足道或显而易见的.

关于java - 使用插入排序修改快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133053/

相关文章:

java - 如何从“设置 Activity ”修改“MainActivity”上的数据?

java - ActionListener 没有实现

java - Quicksort(来自 Programming perls 一书)

algorithm - Quick sort中解决最差时间复杂度是3的中位数吗?

sorting - 为什么归并排序更适合链表?

algorithm - QuickSort 的优化或错误实现

java - 静态方法中变量的永久更改

java - 当映射器类具有多个具有常量返回类型的方法时,常量不起作用

java - 什么是 Xuggler 的好替代品,因为它的开发已经停止?

javascript - 输入的初始排序如何影响 Array.sort 性能?