• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:基準値をランダムに選んでの選択ソート)

基準値をランダムに選んでの選択ソート

このQ&Aのポイント
  • C言語を使用した、基準値をランダムに選んでK番目に小さい要素を検索するプログラムの動作がうまくいかないです
  • プログラムでは、配列要素から基準値をランダムに選び、選択ソートのアルゴリズムを使用してK番目に小さい要素を検索しています
  • しかし、どの部分が間違っているのかわかりません。どなたか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.3

partition3において randspot=rand()%(high+1); pivotitem=s[randspot]; のところでせっかくselection3の呼び出しでlowとhighを制限しているにもかかわらずs[]に対していつでもすべてのアイテムの中から抽出しています。 下記に変更 randspot=rand()%(high-low+1); pivotitem=s[randspot+low]; あたりになるでしょうか。 void partition3(int *s,int low,int high,int *pivotpoint1){ int i,j,randspot; int tmp; int pivotitem; randspot=rand()%(high-low+1); //ここで基準値の保管場所がわからなくなるのを防止するため最後のアイテムと交換しておく pivotitem=s[low+randspot]; s[low+randspot]=s[high]; s[high]=pivotitem; j=low; // printf(" P=%d \n",pivotitem); for(i=low;i<high;i++){ if(s[i]<pivotitem){ tmp=s[j]; s[j]=s[i]; s[i]=tmp; j++; } } *pivotpoint1=j; //ここで基準値のはいる場所が決まったので待避しておいた値と交換する。 tmp=s[j]; s[j]=pivotitem; s[high]=tmp; }

ken6791
質問者

お礼

レスかなり遅れてもうしわけございませんでした。 keikanさんの意見を参考にしてみたら、できました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.2

partition3はなにをしようとしていますか?^^ どのようにソートしたいとお考えですか?^^

ken6791
質問者

補足

ランダムに基準値(pivot)を決めて、その基準値よりも小さい要素を左に、大きい要素を右に分けたいのですが。

すると、全ての回答が全文表示されます。
  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

j=low; for(i=low+1;i<=high;i++){ if(s[i]<pivotitem){ j++; tmp=s[i]; s[i]=s[j]; s[j]=tmp; } } ここのルーチンでlow=0のときiの初期値はlow+1で1です。このときs[i]<pivotitemを満たしたとき j++でj=1です。結果として tmp=s[i]; s[i]=s[j]; s[j]=tmp; この交換はなにもしていないことになりませんか? このことがループの間s[i]<pivotitemであり続けたとき同じようにjも加算されていくので交換しないままループします。 s[i]>pivotitemであったとき初めてiとjがずれるのでそれ以降交換が始まります。 この辺に何か問題はありませんか?

ken6791
質問者

補足

具体的にはどうすればいいのでしょうか?教えてください。

すると、全ての回答が全文表示されます。

専門家に質問してみよう