配列による文字列の辞書順クイックソート
Posted: 2009年8月07日(金) 13:28
グローバル変数である二次元配列に格納した文字列データをクイックソートを使って辞書順にソートするプログラムを作成しています。ピボットを左端や右端にした場合は正常に動作しているようなのですが中央値((左端+右端)/2)をピボットにとると正常にソートできません。原因が分からないので指摘していただけないでしょうか。
void quicksort(int left, int right) { int i, j; char *x; //if (left>=right) return; x=words[(left+right)/2]; for(i=left,j=right;;i++,j--){ while(compare(words,x)<0){ //printf("cmp1:%scmp2:%s%d\n",words,x,compare(words,x)); i++;} while(compare(words[j],x)>0)j--; if(i>=j) break; swap(words,words[j]); } if(left<i-1) quicksort(left,i-1); if(j+1<right) quicksort(j+1,right); } void swap(char x[/url],char y[/url]){ char temp[WORD_LIMIT]; int i; for(i=0;x!=0;i++) temp=x; temp='\0'; for(i=0;y!=0;i++) x=y[i]; x[i]='\0'; for(i=0;temp[i]!=0;i++) y[i]=temp[i]; y [i]='\0'; } int compare(char w1[/url],char w2[/url]){ int flg=0; int i=0; while(w1[i]==w2[i]&&w1[i]!=0&&w2[i]!=0) i++; if(w1[i]>w2[i]) flg=1; else if(w1[i]==w2[i]) flg=0; else flg=-1; if(flg==0){ if(w1[i]==0&&w2[i]!=0) flg=-1; else if(w1[i]!=0&&w2[i]==0) flg=1;} return flg; }