有问题的Shell排序C,无限循环

时间:2013-03-04 13:44:03

标签: c sorting segmentation-fault shellsort

我的程序的一小部分存在问题,它会产生一个随机数列表,然后shell对它们进行排序,现在它不会完成计算,这让我觉得循环没有完成。我得到了分段错误错误但我设法通过修复我访问我的数组的一些问题来解决这个问题。无论如何,一双新鲜的眼睛可能对我有好处。

谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

    printf("How long would you like to make the list? \n");

    int list_length;
    scanf("%d", &list_length);

    int *number_list[list_length];
    int random_number;
    int i;
    for(i=0; i<list_length; i++){
        srand ( time(NULL) );
        random_number = rand();
        number_list[i] = random_number; 
    }

    printf("Before: ");
    printf("%d", &number_list[0]);
    printf("\n");
    shellSort(*number_list, list_length);

    printf("After: ");
    printf("%d", &number_list[0]);
    printf("\n");

    return 0;
}

void shellSort(int *A, int n){
int gap , i , j , temp; 

for (gap = n/2; gap>0; gap /=2)
    for (i=gap; i<n; i++)
        for(i = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap){
            temp = &A[j]; 
            A[j] = &A[j + gap]; 
            A[j + gap] = temp; 
        }
}

3 个答案:

答案 0 :(得分:3)

也许您应该在此行中使用j代替i

 for(j = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap) // <- first i is replaced by j
//   ^ 
//   Here

答案 1 :(得分:1)

在这一行 for(i = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap){您正在初始化i,但是您递减并检查j。您应该将赋值运算符的左侧从i更改为j

答案 2 :(得分:1)

您的代码甚至不应该编译。您将number_list声明为int的指针数组,但随后为其分配int。您也无法在C89中声明非常量大小的数组。