2017-09-21 3 views
-1
void QuickSort(int* x, int first, int last) { 
    if (first >= last) 
     ; 
    else { 
     int pivotindex = Partition(x, first, last); 

     QuickSort(x, first, pivotindex - 1); 
     QuickSort(x, pivotindex + 1, last); 
    } 
} 

int Partition(int* x, int first, int last) { 
    int isbig = first + 1, issmall = last, tmp; 

    while (1) { 
     while (x[isbig++] < x[first] && isbig != last + 1);  // 

     while (x[issmall--] > x[first] && issmall != first); // 

     if (isbig < issmall) { //   tmp = x[issmall]; 
      x[issmall] = x[isbig]; 
      x[isbig] = tmp; 
     } 
     else { //   tmp = x[first]; 
      x[first] = x[issmall]; 
      x[issmall] = tmp; 

      break; // 
     } 
    } 

    return issmall; // 
} 

私はこのコードに問題があります。私は自分でコードする。 これは機能しています。しかし、問題は私が作ったマージソートアルゴリズムよりも比較的遅いです。 問題が何かを見つけることができません。 (マージソートとクイックソートの時間の複雑さは、ソートされていないデータでは同じだが、10,000のデータソートの場合はtime comparison ignore korean悪いコードはありますか? (Cでの時間の複雑なクイックソート)

マージソートの10倍です。コードが悪いということだと思います。 しかし、どこにあるのかわかりません。 時間の複雑さを大きくするコードの悪い部分はありますか?

+2

あなたは2つの重要な行をコメントアウトしているように見えますか? (または、コードはひどくフォーマットされていますか?) –

+1

コードは 'tmp'を使用しますが、決して設定しません。 – chux

+0

ご質問ありがとうございます。私は理由を見つける。 Actully私はソートされた並べ替えだった。しかし、私はそれがソートされていないアリーであると思う。つまり、結果の時間は最悪の時間です。 –

答えて

1

最悪の場合はO(n^2)です。ここに表示されています。これは、配列の最初の要素をピボットとして使用し、ソートされたデータをソートするので、配列が1つの要素とn-1要素に分割されるためです。

比較のため、mergesortは常にO(n log n)です。

x[first]を使用する代わりに、x[(first + last)/2]をピボットとして使用できます。

参照:https://en.wikipedia.org/wiki/Quicksort#Choice_of_pivot

+0

中間要素を使用すると、ソートされたデータにn^2の複雑さが生じません。これは一般的なケースです。無作為に選ばれたピボットの選択にn^2の複雑さを与えるケースを悪意のあるように構築する可能性があります。 – user3080953

+0

まあ、コメントを削除しました。しかし、なぜデータをソートするためにソート機能を使用するのが一般的なケースですか?私は反対が本当であると言います。 –

+0

良い。私はあなたが正しいと思う、それは実際にユースケースに依存する – user3080953

関連する問題