我的程序中有quicksort
的修改版本,指示按其方块的总和对pairs
个数字进行排序(例如:-4,1 > 2,2
)。我的程序与positive integers
一起工作正常,但是当我使用太多negative integers
时程序崩溃(任何超过一个或两个负数都会导致崩溃)。我想我正在尝试access
或sort
存储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);
}
}
答案 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_pts
和j
。
j+1
建议稍作改善
quicksort(arr,first,j);
quicksort(arr,j+1,last);
的实施可以更简单。
square
答案 1 :(得分:0)
last
索引为num_of_pts-1
,所以
quicksort(unsorted_pts_arr,0,num_of_pts);
必须是
quicksort(unsorted_pts_arr, 0, num_of_pts-1);
pivot
与i
和j
一样用于索引arr
中的一对数字,因此它也必须加倍:
(square(arr[pivot])+square(arr[pivot+1]))
(两次出现)必须
square(arr[2*pivot])+square(arr[2*pivot+1])
quicksort
将索引传递给数字对(如main
中所示),因此递归调用的参数也不能加倍:
quicksort(arr,first,2*j-1);
quicksort(arr,2*j+1,last);
必须是
quicksort(arr, first, j-1);
quicksort(arr, j+1, last);