2016-10-23 3 views
0

私はCの初心者で、引数としてランダムに生成された実数配列とそのサイズを取るQuicksortプログラムをコーディングしようとしていましたが、要素を昇順にソートしています。サブ配列A [0 ... q-1]を表すための関数QuickSortの最初の再帰呼び出しで、配列サイズフィールドに何を入れるべきか分かりません。限り、乱数を生成するドライバプログラムにリンクすると、プログラムは誤った順序で要素を返すので、コードの残りの部分は問題ありません。私は助言/提案を感謝します。正しく分割されたQuickSort配列

A[i]=something; 

A[i]somethingを交換して:あなたは唯一の問題だ

int Partition(float *,int); 

int QuickSort(float *A,int n) 
{ 
    int q; 

    if(n>1){ 
    q = Partition(A,n); 
    QuickSort(&A[],q); //Trying to figure out what to put in here. 
    QuickSort(&A[q+1],(n-1)-q); //This recursion sends the subarray A[q+1...n-1] to QuickSort, I think it works fine. 
    } 
} 

int Partition(float *A,int n){ 
    int i,j; 
    float x; 

    x = A[n-1]; 
    i=0; 
    for(j=0;j<=n-2;j++){ 
    if(A[j] <= x){ 
     A[i]=A[j]; 
     i = i+1; 
    } 
    } 
    A[i]=A[n-1]; 
    return i; 
} 
+0

欠落した添字として0を使用してください。 –

+0

えーと、それは近いです、サブアレイは正しくソートされますが、全体の配列はソートされません。それは次のようになります。 A [0] = 0.197551 A [1] = 0.277775 A [2] = 0.277775 A [3] = 0.277775 A [4] = 0.553970 A [5] = 0.197551 A [ 6] = 0.277775 A [7] = 0.277775 A [8] = 0.553970 A [9] = 0.553970 – Stavo

+0

基本的な配列印刷機能を追加した場合は、 'Partition() '入国時と退場時に。それを行うと、パーティション化コードがアレイを完全に壊していることがわかります。前後の内容は同じではありません。例えば、私は 'P1(5): [0] = 0.197551 [1] = 0.277775 [2] = 0.277775 [3] = 0.277775 [4] = 0.197551' - ' P2(5): [0]添字 '[1]'の値が0.277775から0.197551に変化した場合、0.197551 [1] = 0.197551 [2] = 0.277775 [3] = 0.277775 [4] = 0.197551'となる。要素を移動するだけでなく、スワップする必要があります。 –

答えて

1

は、あなたが混乱するように見えるです。補助tmpを追加するか、スワップ関数を作成してください:

#include<stdio.h> 
int Partition(float *,int); 

void QuickSort(float *A,int n) { 
    int q; 

    if(n>1){ 
    q = Partition(A,n); 
    QuickSort(A,q); //Trying to figure out what to put in here. 
    QuickSort(A+q+1,(n-q-1)); //This recursion sends the subarray A[q+1...n-1] to QuickSort, I think it works fine. 
    } 
} 

int Partition(float *A,int n){ 
    int i,j; 
    float x; 
    float tmp; 
    x = A[n-1]; 
    i=0; 
    for(j=0;j<=n-2;j++){ 
    if(A[j] <= x){ 
     tmp = A[i]; 
     A[i]=A[j]; 
     A[j]=tmp; 
     i = i+1; 
    } 
    } 
    tmp = A[i]; 
    A[i]=A[n-1]; 
    A[n-1]=tmp; 
    return i; 
} 

int main() { 
    float A[] = {3, 4, -5, 10, 21, -9, -1, 7, 8, 10}; 
    QuickSort(A,10); 
    for(int i = 0; i < 10; i ++) 
     printf("%f ",A[i]); 
    return 0; 
} 
+0

私は 'QuickSort()'で戻り値の型を固定しているのを見ました - 良い! –

関連する問題