c - qsort 是如何工作的?

标签 c algorithm sorting quicksort

谁能解释一下这种排序算法的作用?我无法遵循逻辑,它使用递归。把中间项和第一个(从上数第 8 行)交换起来似乎很奇怪。另外,在第一次迭代中,++last = i,因此对 swap 的调用被浪费了。

代码设置last = lefti = left + 1,然后用++last调用swap()。这使得 last 等于 i!

/* qsort: sort v[left]...v[right] into increasing order */
void qsort(int v[], int left, int right)
{
    int i, last;

    if (left >= right) /* do nothing if array contains */
        return; /* fewer than two elements */

    swap(v, left, (left + right)/2); /* move partition elem */
    last = left;                     /* to v[0] */

    for (i = left + 1; i <= right; i++) /* partition */
        if (v[i] < v[left])
            swap(v, ++last, i);
    swap(v, left, last); /* restore partition elem */
    qsort(v, left, last-1);
    qsort(v, last+1, right);
}

/* swap: interchange v[i] and v[j] */
void swap(int v[], int i, int j)
{
    int temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

最佳答案

代码中的注释解释得很清楚。开始时,选择一个“分区”元素并将其移动到数组的开头,以便后续交换不会触及它。然后对所有剩余元素进行部分排序,以便可以将此“分区”元素插入到已排序数组中的最后位置,这就是最后一个交换所做的(就在对左侧和右侧的部分调用递归之前)分区元素)。

有关算法的详细信息,请阅读 Quick sort .

关于c - qsort 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17641948/

相关文章:

C - wchar_t 打印不需要的字符

javascript - 负循环 while 循环是无限循环 - 尝试在没有操作数的情况下添加

perl - 对嵌套哈希的哈希键进行排序

java - 使用数据 vector 对 JTable 进行排序

c# - C# 集合上的排名搜索

java - 使用值和时间优先级(如果相等)对 LinkedHashMap 进行排序

c - GCC:禁止使用某些寄存器

c - 什么时候函数会加载到内存中?

c - 如何将 char* 地址发送到函数,以便以十六进制打印

algorithm - 彩色图像压缩、隐写分析和颜色间关联