c++ - 如何使快速排序算法中已排序数组的交换次数为零?

标签 c++ c algorithm sorting quicksort

有没有办法让已经排序的升序数组列表的交换次数为零。

int partition (int arr[], int low, int high)
{
    int pivot = arr[high];    // pivot
    int i = (low - 1);  // Index of smaller element

    for (int j = low; j <= high- 1; j++)
    {
         // If current element is smaller than or
         // equal to pivot
         if (arr[j] <= pivot)
          {
           printf("inside if");
           i++;    // increment index of smaller element
           swap(&arr[i], &arr[j]);
           no_of_comparisons++;
          }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

最佳答案

如果您使用中间元素而不是列表中的最后一个元素(并稍微重新排列算法),则可以避免交换。

为了获得最佳的 qsort,您最好使用第一个、最后一个和中间元素的中位数(称为“三的中位数”)。

如果您担心对攻击者生成的数据进行排序的性能(qsort 的平均性能为 O(n log n),但最坏情况为 O(n²)),请使用随机枢轴。 p>

注意:我可以看到问题是关于 partition 而不是 qsort,但它很可能是在 qsort 的上下文中。

关于c++ - 如何使快速排序算法中已排序数组的交换次数为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264035/

相关文章:

algorithm - 一般动态规划问题的表述

C++ 将(静态)const 全局变量设置为另一个静态 const 变量时出现编译器错误

c - 如何将结构数组的属性作为参数发送给 C 中的函数?

c++ - DirectX 11 E_INVALIDARG 在设备创建期间

从一个公共(public)文件编译具有底层函数的多个 C 文件

c - 我在编译和运行我的 C 程序时遇到问题。命令是什么?

algorithm - 为 FTP 和 HTTP 传输选择缓冲区大小

java - 布隆过滤器用于在 O(n) 内从整数流中删除重复项

c++ - SizeOfImage 成员导致程序崩溃

C++:Shared_Ptr 在虚拟方法调用上出现段错误,但不是取消引用