-1

これが私のコードです:

#include <stdio.h>
#define SIZE 4
int main(int argc, const char * argv[])
{
double m[SIZE],tmp;
int i,min,max,c,k,l,pos;
for (i=0; i<SIZE; i++) {
    printf("a%d? ",i);
    scanf("%lf",&m[i]);
}
for (i=0; i<SIZE; i++)
    printf("%.1lf ",m[i]);
printf("\n");
k = 1;
//========================
do {
    min = 0;
    max = k-1;
    do
    {
        c = (min+max)/2;
        if (m[c]>m[k]) 
        {
            min=c;
        }
        else {
            max=c; 
        }
        c = (min+max)/2; 
    }
    while(min != c);
    pos = min; 
    if(m[pos]<m[k])
    {
            pos++;
    }
    tmp = m[k]; 
    l=k;
    while (l>pos) {
        m[l]=m[l-1];
        l--;
    }
    m[pos]=tmp;
    k++;
} while (k != SIZE);
for (i=0; i<SIZE; i++)
    printf("%.1lf ",m[i]);
//========================
return 0;

}

誰かが助けてくれますか?なぜ並べ替えが機能しないのですか? 私が思うように、コードは正しいです。多分私はアルゴリズムに間違っていますか?

バイナリ挿入ソートを使用しようとしています。または、誰かがCコードの代替案を提供できますか(何が間違っているかを確認するため)?

4

2 に答える 2

0

の抽象アルゴリズムinsertion sortは次のとおりです。

function insertionSort(array A)
    for i from 1 to length[A]-1 do
        value := A[i] 
        j := i-1
        while j >= 0 and A[j] > value do
            A[j+1] := A[j]
            j := j-1
        done
        A[j+1] = value
    done

に実装するとC、次のようになります。

    void binaryInsertionSort (int a[], int n)
   {
     register int i, m;
     int hi, lo, tmp;

     for (i = 1; i < n; i++) {
        lo = 0, hi = i;
        m = i / 2;

        do {
            if (a[i] > a[m]) {
                lo = m + 1;
            } else if (a[i] < a[m]) {
                hi = m;
            } else
                break;

            m = lo + ((hi - lo) / 2);
        } while (lo < hi);

        if (m < i) {
            tmp = a[i];
            memmove (a + m + 1, a + m, sizeof (int) * (i - m));
            a[m] = tmp;
        }
    }
}
于 2012-07-09T17:27:33.730 に答える