【问题标题】:Why Quick sort function change argument's value为什么快速排序函数更改参数值
【发布时间】:2017-02-14 08:57:56
【问题描述】:

我正在阅读递归部分的“ANSI-C 编程语言”。我正在运行递归示例:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

static int v[] = {1,3,6,1,2,3,6,89,3,5,7,2,3};
int size = sizeof(v)/sizeof(v[0]);

void sy_swap (int v[], int i, int j);
void sy_qsort(int v[], int left, int right);

/*Swap function*/
void sy_swap (int v[], int i, int j)
{
    int temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

/*Sort function*/
void sy_qsort(int v[], int left, int right)
{
    int i, last;
    static int loop = 0;

    if(left >= right){  /*Finish sort*/
        return;
    }
    sy_swap(v, left, (left + right)/2); /*Move middle element to beginning of the half*/
    last = left;
    for(i = left+1; i<=right; i++){ /*After this loop, we have to half: smaller than 'middle element' and bigger*/
        if (v[i] < v[left]){
            sy_swap(v, ++last, i);
        }
    }
    sy_swap(v, left, last); /*Move 'middle element' to the head of SMALL half, to finish division the array into 2 half*/

    sy_qsort(v,left, last-1);   /*Sort Small Half*/
    sy_qsort(v, last+1, right); /*Sort Big Half*/

}

int main(void)
{
    int i = 0;

    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' before sort*/
    sy_qsort(v,0,size);
    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' after sort*/

    for (i =0; i<size; i++){
        printf("%d,",v[i]);
    }

    return (0);
}

有谁知道为什么在调用排序函数后更改了“大小”变量,尽管排序函数内部没有更改“正确”参数的操作?

这是显示“大小”从实际的 13(数组中的元素总数)变为 89(数组中的最大元素)的结果

sizes: size of v=52, size of v[0]=4, total elements=13
sizes: size of v=52, size of v[0]=4, total **elements=89**
1,1,2,2,3,3,3,3,5,6,6,7,13,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0......

【问题讨论】:

    标签: c ansi-c


    【解决方案1】:

    您有未定义的行为,因为您将数组的 size 包含为有效索引,但事实并非如此。

    以循环为例

    for(i = left+1; i<=right; i++)
    

    在第一次从main 函数调用sy_qsort 时,变量right 等于size,这是数组的大小,但作为索引,它超过了一个 em> 最后一个元素。条件必须是i &lt; right

    【讨论】:

    • 非常感谢,您是正确的。由于left,right是arry中元素的索引,调用排序函数时必须为:sy_qsort(v,0,size-1);
    猜你喜欢
    • 2018-05-24
    • 2011-04-02
    • 2015-05-29
    • 1970-01-01
    • 2021-07-27
    • 2011-11-30
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多