2 qq 15802159 qq_15802159 于 2016.01.14 23:06 提问

插入排序的C递归实现,不知道哪里不对.

#include
#define N 5 //数组长度

int no_rec=0; //记录递归次数的变量
void insert_sort(int );
int main()
{
int arr[N]={5,4,3,2,1};
insert_sort(arr);
for(int i=0;i<=N-1;i++)
printf("%d ",arr[i]);
}
void insert_sort(int *arr) //这个指针在递归时从数组首元指向数组的倒数第二 个元素。
{
no_rec+=1;
int key=
(arr+1); //根据这个指针,找到数组的下一个元素,也就是需要插入的 元素。
int j=no_rec;
while(j>0 && (arr+j-1)>key) //这一部分就是一般的插入排序了。
{
*(arr+j)=
(arr+j-1);
j--;
}
*(arr+j)=key;
if(no_rec<N-1) //根据数组的长度 N,确定调用次数
insert_sort(arr+1); //调用时,指针指向下一个元素。
}

可是为什么不对啊?

3个回答

u012505618
u012505618   2016.01.14 23:29
已采纳

我把lz的程序改动了一下,应该正确了,望采纳

 #include<stdio.h>
#define N 5 //数组长度

int no_rec=0; //记录递归次数的变量
void insert_sort(int* );
int main()
{
    int arr[N]={5,3,4,6,1};
    insert_sort(arr);
    for(int i=0;i<=N-1;i++)
    printf("%d ",arr[i]);
} 
void insert_sort(int *arr) //这个指针在递归时从数组首元指向数组的倒数第二 个元素。 
{
    no_rec+=1;
    int key=*(arr+no_rec); //根据这个指针,找到数组的下一个元素,也就是需要插入的 元素。
    int j=no_rec;
    while(j>0 && *(arr+j-1)>key) //这一部分就是一般的插入排序了。 
    {
        *(arr+j)=*(arr+j-1);
        j--;
    }
    *(arr+j)=key; 
    if(no_rec<N-1) //根据数组的长度 N,确定调用次数 
        insert_sort(arr); //调用时,指针指向下一个元素。 
}
qq_15802159
qq_15802159 多谢!是正确的。
接近 2 年之前 回复
u012505618
u012505618   2016.01.14 23:16

lz void insert_sort(int )这个函数和insert_sort(arr)不匹配的吧

qq_15802159
qq_15802159 回复cxlovu: 今天想明白了,用指针是可以访问原来的数组的,但是我在while循环里那样写是错的,因为从第二次循环时arr[j-1]是所要插入元素的下一个元素,而不是其上一个元素,这样就错了。我是在打印他们的地址后发现了这个错误,应该像你那样改,谢谢了,不然我还陷在里面。
接近 2 年之前 回复
qq_15802159
qq_15802159 还是没太明白,利用这个指针来访问原来数组的元素并赋值不行吗?
接近 2 年之前 回复
u012505618
u012505618 回复EulerEquation: lz你的函数递归时传下去的并不是数组所以找不到的
接近 2 年之前 回复
qq_15802159
qq_15802159 这个可能是发帖的时候写错了,原来是匹配的。还有一个问题,我原来那样写为什么不对呢?递归时传入的地址和main中原来数组元素的地址是一致的,可是执行while循环时根据地址得到的数却不是原来数组中的元素了。
接近 2 年之前 回复
CSDNXIAON
CSDNXIAON   2016.01.14 23:08

插入排序(C实现)
插入排序 C实现
插入排序的递归实现
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!