C排序更改数组中的值

时间:2016-06-24 19:21:56

标签: c arrays sorting

您好,我正在我的一个程序中使用排序算法。这是快速排序。我用排序数组测试了它,如下所示

int arr[7] = {1,2,3,4,5,6,7};

排序算法代码是

void sort(int arr[],int left,int right)
{
   int i= left, j= right;
   int pivot = arr[((left+right)/2)];
   int tmp=0;


/* partition */
   printf("%d\n",arr[0]);
   while(i<=j)
   {
      while(arr[i]<pivot)
          i++;

      while(arr[j]>pivot)
          j--;

      if(i<=j)
      {
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
        i++;
        j--;
      }


   };

/* recursion */

   if(left<j)
      sort(arr,left,j);
   if(i<right)
      sort(arr,i,right);

 } 

当它返回结果时,它将arr [0]值赋值为0.应为1。

我在main中调用了这个函数。以下是调用sort

的代码
int main()
{
  int i;
  int arr[7] = {1,2,3,4,5,6,7};int max=0,min=0;

  int len = (sizeof(arr)/sizeof(arr[0]));

  printf("%d\n",arr[0]);

  sort(arr,0,len);

  printf("%d\n",arr[0]);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

这是你的问题:

sort(arr,0,len);

您将大小作为最右侧的数组元素传递。这会导致您读取和写出数组的末尾,从而产生undefined behavior

您需要传入最右边元素的索引,该索引少1:

sort(arr,0,len-1);

答案 1 :(得分:1)

算法本身看起来不错,但我认为在<= pivot循环中使用>= pivotwhile会更好。

我能想到的唯一问题是你使用参数sort调用0函数和数组中的元素数量。但请注意,right这里表示正确位置的索引,而不是后面的索引。所以它应该是7sizeof(arr)/sizeof(arr[0])-1)