クイックソート

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みけCAT

クイックソート

#1

投稿記事 by みけCAT » 14年前

開発環境は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;
            }
        }
    }
}

box

Re:クイックソート

#2

投稿記事 by box » 14年前

> クイックソートの関数を書いたのですが、うまくソートできないようです。

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

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

画像

みけCAT

Re:クイックソート

#3

投稿記事 by みけCAT » 14年前

for文の8をdatanumに変えても解決しませんでした。
しかし、別の方法で解決しました。
携帯からなのでコードは後で貼ります。

みけCAT

Re:クイックソート

#4

投稿記事 by みけCAT » 14年前

解決しました。
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;
            }
        }
    }
}

閉鎖

“C言語何でも質問掲示板” へ戻る