ページ 11

クイックソート

Posted: 2010年11月03日(水) 22:18
by みけCAT
開発環境はDev-C++4.9.9.2、コンパイラはデフォルトです。
クイックソートの関数を書いたのですが、うまくソートできないようです。
int型の配列を昇順にソートしようとしています。
原因がわかりましたら教えてください。
お願いします。
プロジェクト全体も添付しておきます。
void quicksort(int* arr,int size) {
    int left;
    int right;
    int maeleft;
    int maeright;
    int pipot;
    int temp;
    int lstack[100];
    int rstack[100];
    int stacknum;
    lstack[0]=0;
    rstack[0]=size-1;
    stacknum=0;
    while(stacknum>=0) {
        maeleft=left=lstack[stacknum];
        maeright=right=rstack[stacknum];
        pipot=arr[(left+right)/2];
        while(left<right) {
            for(;left<size && arr[left]<pipot;left++);
            for(;right>=0 && arr[right]>pipot;right--);
            if(left<=right) {
                temp=arr[left];
                arr[left]=arr[right];
                arr[right]=temp;
                left++;
                right--;
            }
        }
        if(left==right) {
            left++;
            right--;
        }
        stacknum--;
        if(right-maeleft<maeright-left) {
            if(maeleft<right) {
                stacknum++;
                lstack[stacknum]=maeleft;
                rstack[stacknum]=right;
            }
            if(left<maeright) {
                stacknum++;
                lstack[stacknum]=left;
                rstack[stacknum]=maeright;
            }
        } else {
            if(left<maeright) {
                stacknum++;
                lstack[stacknum]=left;
                rstack[stacknum]=maeright;
            }
            if(maeleft<right) {
                stacknum++;
                lstack[stacknum]=maeleft;
                rstack[stacknum]=right;
            }
        }
    }
}

Re:クイックソート

Posted: 2010年11月03日(水) 23:05
by box
> クイックソートの関数を書いたのですが、うまくソートできないようです。

根拠がわかりません。具体的に示してください。

デバッグ用のprintf関数を活かしたとして、
8個で固定のデータを出力するようになっていますので、
ソート対象のデータ個数が7個以下だったらゴミデータも出力しようとするため
「ソート失敗」と出力することがあるでしょうね。
まさかとは思いますが、そういうオチではないですよね。

画像

Re:クイックソート

Posted: 2010年11月04日(木) 17:05
by みけCAT
for文の8をdatanumに変えても解決しませんでした。
しかし、別の方法で解決しました。
携帯からなのでコードは後で貼ります。

Re:クイックソート

Posted: 2010年11月06日(土) 21:00
by みけCAT
解決しました。
void quicksort(int* arr,int size) {
    int left;
    int right;
    int maeleft;
    int maeright;
    int pipot;
    int temp;
    int lstack[100];
    int rstack[100];
    int stacknum;
    lstack[0]=0;
    rstack[0]=size-1;
    stacknum=0;
    while(stacknum>=0) {
        maeleft=left=lstack[stacknum];
        maeright=right=rstack[stacknum];
        pipot=arr[(left+right)/2];
        while(left<right) {
            for(;left<=maeright && arr[left]<pipot;left++);
            for(;right>=maeleft && arr[right]>pipot;right--);
            if(left<=right) {
                temp=arr[left];
                arr[left]=arr[right];
                arr[right]=temp;
                left++;
                right--;
            }
        }
        stacknum--;
        if(right-maeleft<maeright-left) {
            if(maeleft<right) {
                stacknum++;
                lstack[stacknum]=maeleft;
                rstack[stacknum]=right;
            }
            if(left<maeright) {
                stacknum++;
                lstack[stacknum]=left;
                rstack[stacknum]=maeright;
            }
        } else {
            if(left<maeright) {
                stacknum++;
                lstack[stacknum]=left;
                rstack[stacknum]=maeright;
            }
            if(maeleft<right) {
                stacknum++;
                lstack[stacknum]=maeleft;
                rstack[stacknum]=right;
            }
        }
    }
}