为什么快速排序功能更改参数值

问题描述:

我正在阅读递归部分的'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...... 

改变你未定义行为因为你包括该数组的size作为有效索引,但事实并非如此。

采取例如环路

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

在从main函数在第一次调用sy_qsort,可变right等于size这是阵列的尺寸,但作为一个指标是一个超越最后一个元素。条件需要是i < right

+1

非常感谢,你是对的。由于left,right是arry中元素的索引,所以在调用sort函数时,它必须是:sy_qsort(v,0,size-1); – sydc