0

プログラムのごく一部で乱数のリストを作成してからシェルで並べ替える問題が発生しています。現在、計算が終了しないため、ループが終了していないと思われます。セグメンテーション違反エラーが発生しましたが、アレイへのアクセス方法に関するいくつかの問題を修正することで、なんとか修正できました。とにかく、新鮮な目は私にとって良いかもしれません。タブがオフの場合は申し訳ありません。

問題はshell_results配列にあると思います

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

int main()
{

  /*Initialize Random Array*/
  int *unsorted_list[1000000];
  int random_number;
  int i;

  for(i=0; i<1000000; i++){

    srand ( time(NULL) );
    random_number = rand();
    unsorted_list[i] = random_number; 
  }

  //Do C Shell Sort 
  double shell_results[10][2];

  double clock_diff;
  int j=1000000;
  clock_t t0, t1;
  int k;

  for(i=0;i<10;i++){
    /* Sort the list using shellSort and take the time difference */ 
    t0 = clock();
    shellSort(*unsorted_list, j);
    t1= clock();

    /*Take difference in time*/
    clock_diff = (t1 - t0); 

    /*Add time and list length to the results array*/
    shell_results[i][0] = (double)j;
    shell_results[i][1] = clock_diff;


    /*Check to make sure the array has been sorted*/
    checkSort(*unsorted_list, j);

    /*Re-initialize a longer array*/
    //j+=1000000;       
    for(k=0; k<j; k++){

      srand ( time(NULL) );
      random_number = rand();
      unsorted_list[k] = random_number; 
    }
  }

  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(j = i-gap; j>=0 && &A[j] > &A[j+gap]; j-=gap){
        temp = &A[j]; 
        A[j] = &A[j + gap]; 
        A[j + gap] = temp; 
      }
}

void checkSort(int *A, int n)
{
  int i;
  for(i=0;i<n;i++){
    if(&A[i]>&A[i+1]){
      printf("Error in sorting \n");
      break;    
    }
  }
}
4

2 に答える 2

2

まず、ライン

int *unsorted_list[1000000];

ポインタを使用しています

もちろん

int unsorted_list[1000000];

あなたがそれを埋めるときを考えたほうがいいでしょう

unsorted_list[i] = random_number; 

PS:srand一度だけ使用する必要があります。

于 2013-03-07T01:44:02.290 に答える
0

タブがオフの場合は申し訳ありません。

あなたはそれについて何かすることができますか?そうでなければ、後悔する必要はありません。もしそうなら、それを行います。

int *unsorted_list[1000000];unsorted_listのタイプは何ですか?intへの100万個のポインタの配列。

unsorted_list[i] = random_number;unsorted_list [i]のタイプは何ですか?intへのポインタ。intオブジェクトへのポインタにint値を割り当てるのが適切であると確信していますか?コンパイラはこの行について警告していませんか?今後、警告について教えていただければ幸いです。

shellSort(*unsorted_list, j);unsorted_listのタイプを修正した後、タイプは何*unsorted_listですか?int。shellSortはどのタイプを期待していますか?intへのポインタ。

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

&A [j]のタイプは何ですか?臨時雇用者の種類は何ですか?あなたのコンパイラがここであなたに与える警告は良くありません、実際、警告は決して良くありません。それらを無視しないでください!

あなたはどの本を読んでいますか?

于 2013-03-07T01:50:44.700 に答える