访问和存储数组中的元素

时间:2015-06-19 04:01:03

标签: c arrays

我的程序中有quicksort的修改版本,指示按其方块的总和对pairs个数字进行排序(例如:-4,1 > 2,2)。我的程序与positive integers一起工作正常,但是当我使用太多negative integers时程序崩溃(任何超过一个或两个负数都会导致崩溃)。我想我正在尝试accesssort存储array integers的未定义部分。我遗忘的array存储是什么?或者其他地方的问题是什么?

void swap(int *a,int *b);
int square(int num);
int abs_value(int num);
void quicksort(int arr[],int first,int last);

int main()
{
   int num_of_pts;
   int num1;
   int num2;
   printf("Enter number of points: ");//points are coordinates on the xy axis
   scanf("%d", &num_of_pts);          //that's why there is double
   int unsorted_pts_arr[2*num_of_pts];//the amount of storage in the array
   for(int i=0; i<num_of_pts; i++){
      printf("Enter Point: ");
      scanf(" %d",&num1);
      scanf(" %d",&num2);
      unsorted_pts_arr[2*i]=num1;
      unsorted_pts_arr[2*i+1]=num2;
   }
   quicksort(unsorted_pts_arr,0,num_of_pts);
   printf("Sorted Points:");
   for(int j=0; j<num_of_pts; j++)
      printf(" (%d,%d)",unsorted_pts_arr[2*j],unsorted_pts_arr[2*j+1]);
   return 0;
}

void swap(int *a,int *b)
{
   int temp;
   temp = *b;
   *b = *a;
   *a = temp;
}

int square(int num)
{
   num=abs_value(num);
   num*=num;
   return num;
}

int abs_value(int num)
{
   if(num<0) return -num;
   else return num;
}

void quicksort(int arr[],int first,int last)
{
   int pivot,j,i;

   if(first<last){
      pivot=first;
      i=first;
      j=last;

      while(i<j){
         while((square(arr[2*i])+square(arr[2*i+1]))<=
               (square(arr[pivot])+square(arr[pivot+1]))
               &&i<last)
            i++;
         while((square(arr[2*j])+square(arr[2*j+1]))>
               (square(arr[pivot])+square(arr[pivot+1])))
            j--;
         if(i<j){
            swap(&arr[2*i],&arr[2*j]);
            swap(&arr[2*i+1],&arr[2*j+1]);
         }
      }
      swap(&arr[pivot],&arr[2*j]);
      swap(&arr[pivot+1],&arr[2*j+1]);
      quicksort(arr,first,2*j-1);
      quicksort(arr,2*j+1,last);
   }
}

2 个答案:

答案 0 :(得分:0)

主要问题

您最有可能通过在递归调用中使用public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editCentimeters = (EditText) findViewById(R.id.editCentimeters); final EditText editInches = (EditText) findViewById(R.id.editInches); Button buttonConvert = (Button)findViewById(R.id.buttonConvert); buttonConvert.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { double centimeters = Double.valueOf( editCentimeters.getText().toString()); double inches = centimeters * 0.393700787 ; editInches.setText(String.valueOf(inches)); } }); } } 2*j-1作为数组索引来访问数组。

2*j+1

当您从 quicksort(arr,first,2*j-1); quicksort(arr,2*j+1,last); 致电quicksort时,main等于last。在递归调用中,您应该使用num_of_ptsj

j+1

建议稍作改善

quicksort(arr,first,j); quicksort(arr,j+1,last); 的实施可以更简单。

square

答案 1 :(得分:0)

  1. last索引为num_of_pts-1,所以

        quicksort(unsorted_pts_arr,0,num_of_pts);
    

    必须是

        quicksort(unsorted_pts_arr, 0, num_of_pts-1);
    
  2. pivotij一样用于索引arr中的一对数字,因此它也必须加倍:

                   (square(arr[pivot])+square(arr[pivot+1]))
    

    (两次出现)必须

                   square(arr[2*pivot])+square(arr[2*pivot+1])
    
  3. quicksort将索引传递给数字对(如main中所示),因此递归调用的参数也不能加倍:

          quicksort(arr,first,2*j-1);
          quicksort(arr,2*j+1,last);
    

    必须是

          quicksort(arr, first, j-1);
          quicksort(arr, j+1, last);