2016-04-16 17 views
2

シェルソートをC言語で実装し、最適化されたバージョンを使用する必要があります(ギャップは最初にarray/2のサイズに設定され、その後この数値は2.2で繰り返し分割されます)。問題は、答えが常に完全にソートされているとは限らず、コード内のロジックエラーやシェルソートのいくつかの欠点が原因かどうかはわかりません。Cのシェルソートで必要な結果が得られない

これは私のコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#define MAX 7 

void shellSort(int *a, int size); 
void insert(int *a, int next_pos, int gap); 

void shellSort(int *a,int size) 
{ 
    int gap = floor(size/2); 
    int next_pos; 
    while (gap>0) 
    { 
     for(next_pos = gap; next_pos < size; next_pos++) 
      insert(a, next_pos, gap); 

     if(gap == 2) 
      gap = 1; 
     else 
      gap = (int)(gap/2.2); 
    } 
} 

void insert(int *a, int next_pos, int gap) 
{ 
    int value = a[next_pos]; 
    while(next_pos >= gap && a[next_pos] < a[next_pos-gap]) 
    { 
     a[next_pos] = a[next_pos-gap]; 
     next_pos = next_pos - gap; 
    } 
    a[next_pos] = value; 
} 

int main() 
{ 
    int nums[MAX]; 
    time_t t; 
    srand((unsigned) time(&t)); // seed randomiser 

    printf("Array before sorting:\n"); 
    int i; 
    for(i=0; i<MAX; i++) 
    { 
     nums[i] = rand() % 101; // filling array with random numbers 
     printf("%d\t", nums[i]); 
    } 

    shellSort(nums, MAX); 

    printf("\nArray after sorting:\n"); 
    for(i=0; i<MAX; i++) 
     printf("%d\t", nums[i]); 

    return 0; 
} 

次は私の出力です:

Array before sorting: 
74 26 1 12 38 81 94 
Array after sorting: 
12 1 26 38 74 81 94 

は、編集:投稿私は私の質問おっと

+0

非常に読みやすいコードといい、問題文の、唯一の問題は解決します。私はタグCのすべての質問がこのようなものであることを願っています。 (BTWタグにスペースを入れることはできませんので、タグを追加するときは** shellsort **または** shell-sort **を探してください)。 –

+0

@AnttiHaapalaありがとう!そして、ええ、私はそれを今考え出しました(私はここで新しいことを申し訳ありません) –

答えて

5

で行われていた前に、私はあなたの問題はここにあると思います:

int value = a[next_pos]; 
while(next_pos >= gap && a[next_pos] < a[next_pos-gap]) 

は、あなたが以下の行でnext_posを変更しているので、私は(シェルソートの私の理解が正しければ)それらのラインを読むべきだと思う:

int value = a[next_pos]; 
while(next_pos >= gap && value < a[next_pos-gap]) 
関連する問題