【发布时间】:2014-10-21 11:00:45
【问题描述】:
所以我的递归选择排序调用两个函数 max_index 和 swap,同时它应该递归地交换这些东西,但由于某种原因,它似乎对某些数组(比如我在 main 中设置的数组)破裂并爆炸.有谁知道为什么会这样?有人可以解释并告诉我为什么这不起作用吗?
int max_index(int arr[], int start, int end)
{
if ( start >= end ) {
return 0;
}
else if ( end - start == 1 ) {
return start;
}
else {
int greatest = max_index(arr, start + 1, end);
if( arr[start] > arr[greatest])
{
return start;
}
else
{
return greatest;
}
}
}
void swap(int arr[], int i, int j) {
int temp;
temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void rec_ssort(int arr[], int len) {
int start = 0;
int last = len - 1;
//int n = len;
int maxindex = max_index(arr, start, last);
//if(arr[maxindex]>0 || arr[maxindex]<n)
{
if(arr[maxindex]>arr[last])
{
swap(arr, maxindex, last);
return rec_ssort(arr, last);
}
if(arr[maxindex] == arr[last])
{
return rec_ssort(arr, last);
}
}
}
int main(void)
{
int i = 0;
int arr[7] = {2,3,4,1,5,6,7};
int start = 0;
int end = 7;
int stuff = 5;
rec_ssort(arr, end);
for(i = 0; i<7; i++)
printf("%d\n", arr[i]);
}
【问题讨论】:
-
我建议您从一个小的输入集开始,然后在调试器中逐行执行代码,看看会发生什么。
-
另外,对于数组的长度,你传递最后一个索引而不是长度。
-
你的意思是什么调试器?我现在在 linux 上,对调试器一无所知。
-
那我建议你先把算法写在纸上,然后再在纸上一步步完成。你可能应该开始的东西。请记住检查较大、相等的 和 较小的值。提示:在纸上做的时候不必使用C语句和关键字和函数调用,简单的单词就足够了。另一种调试技术是插入中间打印输出,记录程序现在正在做什么。
标签: c