クイックソートを作っているのですが。

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

クイックソートを作っているのですが。

#1

投稿記事 by かなたん » 13年前

授業でクイックソートのアルゴリズムを習いました。
それで、まだ宿題でもなんでもないのですが、自分で作ってみようと思いました。
授業で再回帰を使うとか言っていたと思うのですが、いざ作ってみると再回帰は使わずにできてしまいました。
再回帰を使わなかったことに対して先生に聞いてみると、「クイックソートは再回帰を使わないと意味が変わってくる」と言われました。

私は、クイックソートに対して以下のように理解しています。
・ソートしたい数字の羅列を配列に入れておく
・その中からサンプル・レフトポインタ・ライトポインタを決める
・最初は、サンプルは一番左(配列の0番目)、レフトポインタはその隣(配列の1番目)、ライトポインタは一番最後(配列の一番最後)にする
・もし要素数が2つなら、サンプルとレフトポインタは同じ位置とする
・レフトポインタは、サンプルより大きい値が見つかるまで右へ移動する
・ライトポインタは、サンプルより小さい値が見つかるまで左へ移動する
・それぞれ見つかったら、レフトポインタの値とライトポインタの値を入れ替える
・もしライトポインタとレフトポインタが一致したら、その値とサンプルを大小比較する
・大小関係が正しい(サンプルより一致したところの方が大きい)なら、サンプルと一致した部分の前の値とを入れ替える
・正しくないなら、サンプルと一致した部分の値を入れ替える
・このとき、サンプルの位置が確定したことになる
・次に、また新しいサンプル・レフトポインタ・ライトポインタを決める
・というのを、サンプル・レフトポインタ・ライトポインタが重なるまで繰り返す

その理解とともに作っていたのですが、再回帰を使わずに作ることができてしまいました。
MFCでOnTimerを使い、すべての値の位置が確定するまで(位置が確定した要素数が配列の要素数になるまで)ソートの関数を呼び出すということでできてしまいました。
そのソートの関数というのが以下です。

コード:

void CソートView::Onquicksort() //メニューバーでクイックソートを選んだら実行される
{
	// TODO: ここにコマンド ハンドラ コードを追加します。
	mode=2; //OnTimerではmode=2がクイックソートの合図
	selection=0; //位置が確定している要素は0
	s=0; //サンプルを配列の0番目にする
	l=1; //レフトポインタを配列の1番目にする
	r=items-1; //itemsは配列の要素数(25に設定) ライトポインタは、配列の一番最後―要素数-1番目にする
	for(int n=0;n<items;n++){
		checker[n]=false; //すべて確定していない(false)にする
	}
	WTimer=SetTimer(1,200,NULL); //1/2sごとにOnTimerを実行することにする
}
void CソートView::クイックソート(void) //OnTimerで確定している要素数が配列の要素数と一致するまで定期的に呼び出される
{
	while(number[l]<number[s]){ //サンプルの値よりレフトポインタの値が小さいなら
		if(l!=r){ //もしライトポインタ場所が一致していないなら
			l++; //レフトポインタを右へ移動する
		}
		else{
			break; //もしぶつかってしまったら抜ける
		}
	}
	while(number[r]>number[s]){ //サンプルの値よりライトポインタの値が大きいなら
		if(r!=l){ //もしライトポインタと場所が一致していないなら
			r--; //ライトポインタを左へ移動する
		}
		else{
			break; //もしぶつかってしまったら抜ける
		}
	}
	if(l!=r){ //もしレフトポインタの場所とライトポインタの場所が一致していなかったら
		int tmp=number[l]; //レフトポインタの値とライトポインタの値を入れ替える
		number[l]=number[r];
		number[r]=tmp;
	}
	else{ //もし一致していたら
		if(number[s]<number[l]){ //大小関係を比較して、サンプルの値の方が小さいなら
			int tmp=number[s]; //サンプルの値と一致していた前の値とを入れ替える
			number[s]=number[l-1];
			number[l-1]=tmp;
			checker[l-1]=true; //サンプルの値を入れたところは場所確定
			selection++; //確定した場所が1つ増えた
		}
		else{ //もしサンプルの値の方が大きいなら
			int tmp=number[s];  //サンプルの値と一致したところの値とを入れ替える
			number[s]=number[l];
			number[l]=tmp;
			checker[l]=true; //サンプルの値を入れたところは場所確定
			selection++; //確定した場所が1つ増えた
		}
		bool check=true; //サンプルの場所を設定しているかどうかを記憶
		if(s==l || s==l-1){ //サンプルの場所とライトポインタの場所が一致しているか、サンプルの場所がライトポインタの手前なら
			check=false; //これから設定しに行く
			for(int n=s+1;n<items;n++){
				if(checker[n]==false){ //まだ場所が確定していない場所があったら
					s=n; //サンプルの場所をそこに設定
					check=true; //サンプルの場所を設定
					break;
				}
			}
		}
		if(check==true){ //サンプルの場所が設定できていれば
			if(checker[s+1]==false){ //サンプルのとなりが空いていれば
				l=s+1; //レフトポインタをサンプルのとなりにする
			}
			else{ //空いていなければ
				l=s; //レフトポインタをサンプルのところにする
			}
			for(int n=items-1;n>=l;n--){ //ライトポインタの場所を設定しに行く
				if(checker[n]==false){ //配列の最後から確定していないところが見つかり次第
					r=n; //ライトポインタをそこにする
					break;
				}
			}
		}
	}
}
OnDrawでは、その配列の値をもとにドットを表示しています。
実行させてみると私の想像した動きをしてくれるので、自分的にはこれでいいと思っています。
でも、再回帰を使っていないので・・・
やはり、このプログラムはクイックソートではないのでしょうか?

また、このプログラムには他にも問題があります。
ソートは確かにきちんとできている(きちんとクイックソートなのかどうかは別として)のですが、ソートが終わってきれいに並んだ頃、勝手に22番目あたりから21番目・20番目・・・とドットが消えていって、最終的には25番目からも消えてしまい、すべて消えてしまいます。
先生に聞いてみると、「きっとどこかで配列壊れちゃってるんだよ」とか言われましたが、OnTimerは確定している要素数が配列の要素数と一致するとKillTimerにより実行されることはなくなり、特に処理は行われないはずなのですが・・・
なぜでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: クイックソートを作っているのですが。

#2

投稿記事 by h2so5 » 13年前

ソートプログラムを試してみましたが、ランタイムエラーでソートできませんでした。

実験プログラム

コード:

#include<iostream>
#include<array>
 
const int items = 25;
 
int selection=0; //位置が確定している要素は0
int s=0; //サンプルを配列の0番目にする
int l=1; //レフトポインタを配列の1番目にする
int r=items-1; //itemsは配列の要素数(25に設定) ライトポインタは、配列の一番最後―要素数-1番目にする
 
std::array<bool, items> checker;
std::array<int, items> number = {1,2,3,4,5,6,7,18,9,10,11,12,13,14,15,16,17,8,19,20,21,22,23,24,25};
 
void Sort();
 
int main()
{
        checker.fill(false);
        while (selection < items) {
                Sort();
                std::cout << "l:" << l << " r:" << r << " s:" << s << std::endl;
        }
        for (int i = 0; i < items; i++) {
                std::cout << number[i] << std::endl;
        }
        return 0;
}
 
void Sort(void)
{
    while(number[l]<number[s]){ //サンプルの値よりレフトポインタの値が小さいなら
        if(l!=r){ //もしライトポインタ場所が一致していないなら
            l++; //レフトポインタを右へ移動する
        }
        else{
            break; //もしぶつかってしまったら抜ける
        }
    }
    while(number[r]>number[s]){ //サンプルの値よりライトポインタの値が大きいなら
        if(r!=l){ //もしライトポインタと場所が一致していないなら
            r--; //ライトポインタを左へ移動する
        }
        else{
            break; //もしぶつかってしまったら抜ける
        }
    }
    if(l!=r){ //もしレフトポインタの場所とライトポインタの場所が一致していなかったら
        int tmp=number[l]; //レフトポインタの値とライトポインタの値を入れ替える
        number[l]=number[r];
        number[r]=tmp;
    }
    else{ //もし一致していたら
        if(number[s]<number[l]){ //大小関係を比較して、サンプルの値の方が小さいなら
            int tmp=number[s]; //サンプルの値と一致していた前の値とを入れ替える
            number[s]=number[l-1];
            number[l-1]=tmp;
            checker[l-1]=true;//サンプルの値を入れたところは場所確定
            selection++; //確定した場所が1つ増えた
        }
        else{ //もしサンプルの値の方が大きいなら
            int tmp=number[s];  //サンプルの値と一致したところの値とを入れ替える
            number[s]=number[l];
            number[l]=tmp;
            checker[l]=true;//サンプルの値を入れたところは場所確定
            selection++; //確定した場所が1つ増えた
        }
        bool check=true; //サンプルの場所を設定しているかどうかを記憶
        if(s==l || s==l-1){ //サンプルの場所とライトポインタの場所が一致しているか、サンプルの場所がライトポインタの手前なら
            check=false; //これから設定しに行く
            for(int n=s+1;n<items;n++){
                if(checker[n]==false){ //まだ場所が確定していない場所があったら
                    s=n; //サンプルの場所をそこに設定
                    check=true; //サンプルの場所を設定
                    break;
                }
            }
        }
        if(check==true){ //サンプルの場所が設定できていれば
            if(checker[s+1]==false){ //サンプルのとなりが空いていれば
                l=s+1; //レフトポインタをサンプルのとなりにする
            }
            else{ //空いていなければ
                l=s; //レフトポインタをサンプルのところにする
            }
            for(int n=items-1;n>=l;n--){ //ライトポインタの場所を設定しに行く
                if(checker[n]==false){ //配列の最後から確定していないところが見つかり次第
                    r=n; //ライトポインタをそこにする
                    break;
                }
            }
        }
    }
}
実行結果: http://ideone.com/58Amk

ライトポインタよりレフトポインタのほうが右になる現象が起きています。

[追記]

「再回帰」という単語はありません。
この場合は「再帰」が正しいと思います。

かなたん

Re: クイックソートを作っているのですが。

#3

投稿記事 by かなたん » 13年前

h2so5 さんが書きました:ソートプログラムを試してみましたが、ランタイムエラーでソートできませんでした。
なぜランタイムエラーが出てしまったのか・・・;
h2so5さんが実験に使ったというプログラムを私のパソコンに入っているVisal Studio2008で実行しようと思ったのですが、arrayが開けませんと言われてしまいました。
<array>というのは、配列を作るための―C++用のものですか?
そのincludeは始めて知ったもので。
h2so5 さんが書きました:ライトポインタよりレフトポインタのほうが右になる現象が起きています。
ライトよりレフトの方が右―ライトとレフトが一致したら、値がどうであれwhileを抜けるようにしているはずなのですが・・・
また、ライトとレフトを設定するときにもそうならないと思っていたのですが・・・?

以下に、私が試行錯誤していたときに作ったプログラム(C言語とC++を混ぜたような書き方ですが)を載せます。
試行錯誤しているうちは途中結果をすべて表示していたりしましたが、できたかな?というころにコメントアウトしました。
ソートの方法などは最初に載せたものと変わらないです。
(そういえば、最初のプログラムには乱数の部分載せていなかったですね・・・;)

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int number[25];
bool checker[25];
int selection=0;
int items=25;
int s=0,l=1,r=24;

void クイックソート(void)
{
	while(number[l]<number[s]){
		if(l!=r){
			l++;
		}
		else{
			break;
		}
	}
		/*printf("l確定! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");*/
	while(number[r]>number[s]){
		if(r!=l){
			r--;
		}
		else{
			break;
		}
	}
	if(l!=r){
		/*printf("r確定! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");*/
		int tmp=number[l];
		number[l]=number[r];
		number[r]=tmp;
		printf("入れ替え! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");
	}
	else{
		/*printf("r確定! lとr一致! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");*/
		if(number[s]<number[l]){
			int tmp=number[s];
			number[s]=number[l-1];
			number[l-1]=tmp;
			checker[l-1]=true;
			selection++;
		printf("入れ替え! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");
		}
		else{
			int tmp=number[s];
			number[s]=number[l];
			number[l]=tmp;
			checker[l]=true;
			selection++;
		printf("入れ替え! s=%d l=%d r=%d\n",s,l,r);
		for(int n=0;n<items;n++){
			if(n==s){
				printf("S");
			}
			if(n==l){
				printf("L");
			}
			if(n==r){
				printf("R");
			}
			printf("%d ",number[n]);
		}
		printf("\n");
		}
		bool check=true;
		if(s==l || s==l-1){
			check=false;
			for(int n=s+1;n<items;n++){
				if(checker[n]==false){
					s=n;
					check=true;
					break;
				}
			}
		}
		if(check==true){
			if(checker[s+1]==false){
				l=s+1;
			}
			else{
				l=s;
			}
			for(int n=items-1;n>=l;n--){
				if(checker[n]==false){
					r=n;
					break;
				}
			}
			//printf("slr変更! s=%d l=%d r=%d\n",s,l,r);
		}
	}
}
int main(){
	srand((unsigned)time(NULL));
	number[0]=rand()%25+1;
	for(int n=1;n<items;n++){
		bool check=false;
		while(check==false){
			number[n]=rand()%25+1;
			check=true;
			for(int m=n-1;m>=0;m--){
				if(number[n]==number[m]){
					check=false;
					break;
				}
			}
		}
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	while(selection<items){
		クイックソート();
	}
}
実行結果

コード:

乱数完成
1 22 14 13 8 6 9 5 18 16 20 11 17 4 7 2 24 25 19 21 23 10 3 12 15
クイックソート開始
入れ替え! s=0 l=1 r=1
S1 LR22 14 13 8 6 9 5 18 16 20 11 17 4 7 2 24 25 19 21 23 10 3 12 15
入れ替え! s=1 l=16 r=24
1 S22 14 13 8 6 9 5 18 16 20 11 17 4 7 2 L15 25 19 21 23 10 3 12 R24
入れ替え! s=1 l=17 r=23
1 S22 14 13 8 6 9 5 18 16 20 11 17 4 7 2 15 L12 19 21 23 10 3 R25 24
入れ替え! s=1 l=20 r=22
1 S22 14 13 8 6 9 5 18 16 20 11 17 4 7 2 15 12 19 21 L3 10 R23 25 24
入れ替え! s=1 l=22 r=22
1 S10 14 13 8 6 9 5 18 16 20 11 17 4 7 2 15 12 19 21 3 22 LR23 25 24
入れ替え! s=1 l=2 r=20
1 S10 L3 13 8 6 9 5 18 16 20 11 17 4 7 2 15 12 19 21 R14 22 23 25 24
入れ替え! s=1 l=3 r=15
1 S10 3 L2 8 6 9 5 18 16 20 11 17 4 7 R13 15 12 19 21 14 22 23 25 24
入れ替え! s=1 l=8 r=14
1 S10 3 2 8 6 9 5 L7 16 20 11 17 4 R18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=1 l=9 r=13
1 S10 3 2 8 6 9 5 7 L4 20 11 17 R16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=1 l=10 r=10
1 S4 3 2 8 6 9 5 7 10 LR20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=1 l=4 r=4
1 S2 3 4 LR8 6 9 5 7 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=1 l=2 r=2
1 S2 LR3 4 8 6 9 5 7 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=2 l=2 r=2
1 2 SLR3 4 8 6 9 5 7 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=4 l=6 r=8
1 2 3 4 S8 6 L7 5 R9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=4 l=8 r=8
1 2 3 4 S5 6 7 8 LR9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=4 l=5 r=5
1 2 3 4 S5 LR6 7 8 9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=5 l=6 r=6
1 2 3 4 5 S6 LR7 8 9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=6 l=6 r=6
1 2 3 4 5 6 SLR7 8 9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=8 l=8 r=8
1 2 3 4 5 6 7 8 SLR9 10 20 11 17 16 18 13 15 12 19 21 14 22 23 25 24
入れ替え! s=10 l=19 r=20
1 2 3 4 5 6 7 8 9 10 S20 11 17 16 18 13 15 12 19 L14 R21 22 23 25 24
入れ替え! s=10 l=20 r=20
1 2 3 4 5 6 7 8 9 10 S14 11 17 16 18 13 15 12 19 20 LR21 22 23 25 24
入れ替え! s=10 l=12 r=17
1 2 3 4 5 6 7 8 9 10 S14 11 L12 16 18 13 15 R17 19 20 21 22 23 25 24
入れ替え! s=10 l=13 r=15
1 2 3 4 5 6 7 8 9 10 S14 11 12 L13 18 R16 15 17 19 20 21 22 23 25 24
入れ替え! s=10 l=14 r=14
1 2 3 4 5 6 7 8 9 10 S13 11 12 14 LR18 16 15 17 19 20 21 22 23 25 24
入れ替え! s=10 l=13 r=13
1 2 3 4 5 6 7 8 9 10 S12 11 13 LR14 18 16 15 17 19 20 21 22 23 25 24
入れ替え! s=10 l=12 r=12
1 2 3 4 5 6 7 8 9 10 S11 12 LR13 14 18 16 15 17 19 20 21 22 23 25 24
入れ替え! s=10 l=10 r=10
1 2 3 4 5 6 7 8 9 10 SLR11 12 13 14 18 16 15 17 19 20 21 22 23 25 24
入れ替え! s=14 l=18 r=18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 S17 16 15 18 LR19 20 21 22 23 25 24
入れ替え! s=14 l=17 r=17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 S15 16 17 LR18 19 20 21 22 23 25 24
入れ替え! s=14 l=15 r=15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 S15 LR16 17 18 19 20 21 22 23 25 24
入れ替え! s=15 l=15 r=15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SLR16 17 18 19 20 21 22 23 25 24
入れ替え! s=18 l=18 r=18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 SLR19 20 21 22 23 25 24
入れ替え! s=20 l=20 r=20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 SLR21 22 23 25 24
入れ替え! s=22 l=23 r=23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 S23 LR25 24
入れ替え! s=23 l=24 r=24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 S24 LR25
入れ替え! s=23 l=24 r=24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 S24 LR25
続行するには何かキーを押してください . . .
実は、このプログラムを実行しているとき、いつからか1~25以外の全然違う値が出てきてしまうことがあります。
そして、そのまま放っておくと動作が停止します。
これが、MFCで画面からドットが消えてしまう現象と関係しているのでしょうか?
入れ替えているときなどに
h2so5 さんが書きました:「再回帰」という単語はありません。
この場合は「再帰」が正しいと思います。
あ・・・そういえば先生にも訂正されたような・・・;
再帰再帰・・・。
次からは間違えないようにします。

かなたん

Re: クイックソートを作っているのですが。

#4

投稿記事 by かなたん » 13年前

なぜレフトポインタがライトポインタより右に行ってしまうかが分かりました。
レフトポインタの位置を新たに決めるとき、今までは

コード:

if(checker[s+1]==false){ //サンプルのとなりが空いていれば
	l=s+1; //レフトポインタをサンプルのとなりにする
}
else{ //空いていなければ
	l=s; //レフトポインタをサンプルのところにする
}
としていましたが、そのs+1が配列より大きく(今回は値が25以上)なることがありえ、そのときそこに値がきちんと入っているわけではないので、誤作動を起こしていたからです。
うまくいくときがあるのは、たまたまかなと。
そこで、以下のようにs+1が配列の外を参照しないように変更したところ、不具合が発生することはなくなりました。

コード:

if((s+1)<items && checker[s+1]==false){ //s+1が配列より大きくない(今回は値が25未満)であり、その場所が確定しているところではないなら
	l=s+1; //レフトポインタをサンプルのとなりにする
}
else{ //s+1が範囲外またはその場所が確定しているなら
	l=s; //レフトポインタをサンプルのところにする
}
で、最初に聞きたかったことに戻るのですが、再帰を使用していないこのソートは、先生が言うようにクイックソートと言えないのでしょうか?
それとも、再帰を使っていようといまいと、このような考えのソートはクイックソートと言えるのでしょうか?

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: クイックソートを作っているのですが。

#5

投稿記事 by とっち » 13年前

このプログラムをちゃんと見てないのでこれがクイックソートでないかどうかはわかりませんが(ごめんなさい)、
クイックソートは別に再帰を使わなくてもかけます。

ていうか再帰を使うすべてのプログラムは再帰を使わず書き直すことができます
c言語の標準関数のqsort()関数も確か再帰は使ってないはずです
(再帰は速度が遅くなるんで)

かなたん

Re: クイックソートを作っているのですが。

#6

投稿記事 by かなたん » 13年前

とっち さんが書きました:このプログラムをちゃんと見てないのでこれがクイックソートでないかどうかはわかりませんが(ごめんなさい)、
クイックソートは別に再帰を使わなくてもかけます。
ふむふむ。
先生には「まだすべて教えたわけではないから。」とも言われてしまって。
そのときはすべて教われば再帰の必要性が分かるのだろうか?と思っていたのですが、先生の言うように「クイックソートは再帰を使わないと意味が違ってくる」というわけではないんですね。
とっち さんが書きました:ていうか再帰を使うすべてのプログラムは再帰を使わず書き直すことができます
c言語の標準関数のqsort()関数も確か再帰は使ってないはずです
(再帰は速度が遅くなるんで)
再帰は、自身などを呼び出さなくするための終端条件を考えなくてはいけないなどと教わりましたが、そこら辺をうまく変えればどんな再帰でも再帰なしで書き直せるんですね。
再帰は速度が遅いということは、あまり利用しない方がいいんですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: クイックソートを作っているのですが。

#7

投稿記事 by h2so5 » 13年前

先生がどのような意味で「クイックソートは再帰を使わないと意味が違ってくる」と言ったのかが良くわからないので、
この場で結論を出さないほうが良いと思います。

改めて先生に確認されてはいかかでしょうか。
かなたん さんが書きました: 再帰は速度が遅いということは、あまり利用しない方がいいんですか?
そこはコードの簡潔さと実行速度のトレードオフなので何とも言えませんね。
ソートに関しては、速度を重視することが多いので再帰はあまり使わないと思います。

たいちう
記事: 418
登録日時: 14年前

Re: クイックソートを作っているのですが。

#8

投稿記事 by たいちう » 13年前

私の考えでは、かなたんさんの実装はクイックソートではありません。

まず再帰についてですが、再帰的なアルゴリズムと、再帰関数、という
2つの意味を混同しているようです。

とっちさんが書いているのは再帰関数についてです。
確かに全ての再帰関数は、非再帰関数に書き換えることができ、
これによって実行速度などの効率が良くなることも多いです。

しかし、通常はこの書き換えで、再帰的なアルゴリズムが
非再帰的なアルゴリズムに変わるわけではありません。


クイックソートは任意なサンプルを選び、それより小さいグループと
大きいグループに分け、それぞれについて任意なサンプルを選び、、、
と、いう再帰的なアルゴリズムです。
かなたんさんの実装がクイックソートと言えるかどうかは
実装が再帰的なアルゴリズムかどうかが1つのポイントです。
再帰関数の有無ではなく。

プログラムの出力を見るとクイックソートでの結果と同じようですが、
同じ実行結果を別のアルゴリズムで表示しているだけです。


> 私は、クイックソートに対して以下のように理解しています。

この理解が表面的な手順を追いかけているだけなのが原因なのでしょう。
s、l、rを選び直すときに、配列checkerを検索して次の値を決めていますが、
再帰的なアルゴリズムならば、この検索は不要です。
余計な検索が入り、効率も数段落ちてしまえば、
同じアルゴリズムとは言えないでしょう。


先ほどは別のアルゴリズムで表示しているだけと書きましたが、
それでも自分でこれをつくれるならば、初心者のレベルではありません。
是非クイックソートとして完成させてほしいと思います。
checkerの替わりにstd::stackを使えば、完成になると思います。
理解が相当深まるのではないでしょうか。


> 先生の言うように「クイックソートは再帰を使わないと意味が違ってくる」
> というわけではないんですね。

先生の真意は判りませんが、再帰関数はともかく再帰は必須だと思います。


> 再帰は速度が遅いということは、あまり利用しない方がいいんですか?

適切なアルゴリズムを選択することが、速度改善の第一歩です。
アルゴリズムに改善の余地がなく、どうしても速度を改善したいならば
試してみたらいいでしょう。期待した程は改善せず、予想以上に
プログラムの可読性・保守性が低下する場合が多いです。

かなたん

Re: クイックソートを作っているのですが。

#9

投稿記事 by かなたん » 13年前

h2so5 さんが書きました:先生がどのような意味で「クイックソートは再帰を使わないと意味が違ってくる」と言ったのかが良くわからないので、
この場で結論を出さないほうが良いと思います。

改めて先生に確認されてはいかかでしょうか。
次の授業でも取り扱うということなので、もう一度きちんと教わってこようかと思います。
h2so5 さんが書きました:そこはコードの簡潔さと実行速度のトレードオフなので何とも言えませんね。
ソートに関しては、速度を重視することが多いので再帰はあまり使わないと思います。
再帰を使うとコードが読みやすくなる代わりに速度が遅くなるということですね?
たいちう さんが書きました:私の考えでは、かなたんさんの実装はクイックソートではありません。
私のはクイックソートではなかったのですね。
たいちう さんが書きました:まず再帰についてですが、再帰的なアルゴリズムと、再帰関数、という
2つの意味を混同しているようです。

とっちさんが書いているのは再帰関数についてです。
確かに全ての再帰関数は、非再帰関数に書き換えることができ、
これによって実行速度などの効率が良くなることも多いです。

しかし、通常はこの書き換えで、再帰的なアルゴリズムが
非再帰的なアルゴリズムに変わるわけではありません。
私は先生に「クイックソートって再帰(関数)使わないとだめですか?」って聞いたつもりが、先生には「クイックソートって再帰(的なアルゴリズム)使わないとだめですか?」と取られたのかもしれませんね。
たいちう さんが書きました:s、l、rを選び直すときに、配列checkerを検索して次の値を決めていますが、
再帰的なアルゴリズムならば、この検索は不要です。
余計な検索が入り、効率も数段落ちてしまえば、
同じアルゴリズムとは言えないでしょう。
checkerのようなものを使っていてはクイックソートのアルゴリズムとは変わってくるのですね。
たいちう さんが書きました:checkerの替わりにstd::stackを使えば、完成になると思います。
理解が相当深まるのではないでしょうか。
stackって、動的配列のvectorと同じようなものですね。
要素の追加・削除の位置が反対ですけど。
すべての場所において確定したかどうかを記憶するのではなく、確定した場所を記憶するようにするといいとかっていうことですか?
それでも今の場所が確定した場所の中にあるかどうか調べることになるから、もっと違う考えでしょうか?
たいちう さんが書きました:先生の真意は判りませんが、再帰関数はともかく再帰は必須だと思います。
先生には、「for文とか使って呼び出すのではダメ」みたいなことを言われた気がします。
そこから、ますますクイックソートって再帰関数を用いないといけないのかな?って思ったのですが。
たいちう さんが書きました:適切なアルゴリズムを選択することが、速度改善の第一歩です。
アルゴリズムに改善の余地がなく、どうしても速度を改善したいならば
試してみたらいいでしょう。期待した程は改善せず、予想以上に
プログラムの可読性・保守性が低下する場合が多いです。
適切なアルゴリズムで作っていれば、速いとされる方法でもそうでないけど読みやすいとされる方法でも対して速さは変わらないのですね。
それなら、私は自分で理解のしやすいものを選びたいと思います。

かなたん

Re: クイックソートを作っているのですが。

#10

投稿記事 by かなたん » 13年前

先生に「再帰関数使わないとだめなんですよね?」と聞いたところ、「再帰使って、終端条件はsとlとrが一致したときで、いくつでもソートできるクイックソートを作ってほしい」と言われました。
授業的には、再帰関数を使うのが必須のようです。
また、「引数がsとlとr」だとも言っていました。
そこで、先生の言うクイックソートを作ろうと思っているのですが、まだ今までの考えから抜けられていません。
1つ決まったら、その左と右でそれぞれで行うことにして、左が終わったら右を行うようにして―のようにやるんですよね?
今まで新たにrを決めるときは一番右から探して確定していないところにしていましたが、一致して入れ替えて確定したその手前にすればいいんですよね?
で、どんどん左左にやっていって、sとlとrが一致したとき関数を終えるんですよね?
最初にsとlとrが一致したときは、s=l=r=0ですよね?
なので、次からは新たなsを決めないといけないと思うのですが、そのsはどのようにして決めるのですか?
今までで位置が確定した場所を覚えていてというのは―たぶんクイックソートではなくなってしまいますよね・・・

とりあえず、途中ですが載せてみます。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int number[100];
int items;

void quicksort(int s,int l,int r);

int main(void){
	printf("乱数を行くいつ発生させますか?\n(2~100)\n");
	scanf("%d",&items);
	int mode;
	printf("数字の重複を許しますか?\n1.重複可 0.重複不可\n");
	scanf("%d",&mode);
	printf("乱数発生中");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=false;
				while(check==false){
					number[n]=rand()%items+1;
					check=true;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=false;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	int s=0,l=1,r=items-1;
	quicksort(s,l,r);
	printf("途中経過\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void quicksort(int s,int l,int r){
	if(s!=l && l!=r && r!=s){
		while(number[l]<number[s]){
			if(l!=r){
				l++;
			}
			else{
				break;
			}
		}
		while(number[r]>number[s]){
			if(r!=l){
				r--;
			}
			else{
				break;
			}
		}
		if(l!=r){
			int tmp=number[l];
			number[l]=number[r];
			number[r]=tmp;
		}
		else{
			if(number[s]<number[l]){
				int tmp=number[s];
				number[s]=number[l-1];
				number[l-1]=tmp;
				r=l-2;
			}
			else{
				int tmp=number[s];
				number[s]=number[l];
				number[l]=tmp;
				r=l-1;
			}
			l=s+1;
		}
		quicksort(s,l,r);
	}
}
実行結果

コード:

乱数を行くいつ発生させますか?
(2~100)
100
数字の重複を許しますか?
1.重複可 0.重複不可
0
乱数発生中乱数完成
38 10 56 4 30 54 98 69 44 27 1 72 26 90 31 85 61 2 45 92 5 70 96 33 91 94 20 42
79 49 71 50 81 84 3 8 52 25 35 59 34 40 14 48 88 16 11 58 28 60 32 41 89 82 29 7
4 23 75 80 17 76 53 68 63 12 36 86 18 100 66 73 24 9 87 51 62 13 19 7 83 64 57 6
5 43 47 37 21 95 22 93 99 46 15 77 39 78 97 67 55 6
クイックソート開始
途中経過
1 2 3 4 8 7 6 5 9 14 12 15 16 10 11 13 17 19 24 18 21 20 22 23 25 33 36 29 32 28
 31 26 27 34 37 30 35 38 52 59 84 40 81 48 88 50 71 58 49 60 79 41 89 82 42 74 9
4 75 80 91 76 53 68 63 96 70 86 92 100 66 73 45 61 87 51 62 85 90 72 83 64 57 65
 43 47 44 69 95 98 93 99 46 54 77 39 78 97 67 55 56
続行するには何かキーを押してください . . .

かなたん

Re: クイックソートを作っているのですが。

#11

投稿記事 by かなたん » 13年前

新しいsが一致している場所でもできるだろうと、新しいsを今のとなりにしてみました。
すると、きちんとソートさせることはできました。
でも、新しいsをそのように決めてよかったのでしょうか?

とりあえず、以下がきちんとソートさせることができたソースコードです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int number[100];
int items;

void quicksort(int s,int l,int r);

int main(void){
	printf("乱数を行くいつ発生させますか?\n(2~100)\n");
	scanf("%d",&items);
	int mode;
	printf("数字の重複を許しますか?\n1.重複可 0.重複不可\n");
	scanf("%d",&mode);
	printf("乱数発生中\n");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=false;
				while(check==false){
					number[n]=rand()%items+1;
					check=true;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=false;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	int s=0,l=1,r=items-1;
	for(s=0;s<items;s++){
		if(s+1<items){
			l=s+1;
		}
		else{
			l=s;
		}
		r=items-1;
		quicksort(s,l,r);
		printf("途中経過\n");
		for(int n=0;n<items;n++){
			printf("%d ",number[n]);
		}
		printf("\n");
	}
	printf("ソート終了\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void quicksort(int s,int l,int r){
	if(l!=r){
		while(number[l]<number[s]){
			if(l!=r && l<items-1){
				l++;
			}
			else{
				break;
			}
		}
		while(number[r]>number[s]){
			if(r!=l && r>1){
				r--;
			}
			else{
				break;
			}
		}
		if(l!=r){
			int tmp=number[l];
			number[l]=number[r];
			number[r]=tmp;
		}
		else{
			if(number[s]<number[l]){
				int tmp=number[s];
				number[s]=number[l-1];
				number[l-1]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(l>1 && l-2>=s){
					r=l-2;
				}
			}
			else{
				int tmp=number[s];
				number[s]=number[l];
				number[l]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(l>0 && l-1>=s){
					r=l-1;
				}
			}
		}
		quicksort(s,l,r);
	}
}
上限の100個ではすべての結果が表示されない(表示できる長さの関係で古いほうから消えていく)ので、半分の50個で試してみた結果です。

コード:

乱数を行くいつ発生させますか?
(2~100)
50
数字の重複を許しますか?
1.重複可 0.重複不可
0
乱数発生中
乱数完成
9 22 3 33 13 44 36 30 29 39 37 31 47 21 17 27 34 23 6 38 42 40 4 18 1 11 14 19 8
 16 41 12 49 48 10 26 20 25 46 15 5 35 7 45 32 43 24 50 2 28
クイックソート開始
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 8 7 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 7 8 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 7 8 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 7 8 9 39 37 31 47 21 17 27 34 23 29 38 42 40 30 18 36 11 14 19 44 16
 41 12 49 48 10 26 20 25 46 15 13 35 33 45 32 43 24 50 22 28
途中経過
1 2 3 4 5 6 7 8 9 10 11 13 12 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 13 12 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 27 34 23 29 38 22 24 30 18 36 17 21 19 32 16
 33 28 35 31 37 26 20 25 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 18 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 18 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 22 26 23 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 25 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 36 32 30
 33 28 35 31 37 38 29 34 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 33 32 35 31 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 33 32 35 31 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 33 32 35 31 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 35 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 35 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 35 34 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 38 37 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 46 48 49 41 45 44 43 40 50 42 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 45 44 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 45 44 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 45 44 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 45 44 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 48 47
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
ソート終了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
続行するには何かキーを押してください . . .
sはすべて0から終わりの50までになるようにしているので、最後の方無駄にチェックしているような気がしますが・・・
この結果は数字の重複を許さないで乱数を発生させたときです。
重複を許すとプログラムがまだおかしいようで、途中結果が1回も表示されない―たぶん1回目の一致するまでまでに何かしらエラーが発生しているようで、途中で動作が停止してしまいます。
そこら辺はこれからデバッグしながら直していきたいのですが、そもそもこのソートはきちんとクイックソートと言えるでしょうか?
新しいsを決めるところがクイックソート的(?)なのかが不安なのですが・・・

かなたん

Re: クイックソートを作っているのですが。

#12

投稿記事 by かなたん » 13年前

新しいrは、新しいr決める前に位置が確定したところの手前に設定すればいいんですよね?
ということは、あの書き順だと新しいlを決めてしまってから行っているので、一致したときのlの値を頼りに決めているはずのrが↑のようになりませんよね?
と思って新しくlとrを決めるときの順番を入れ替えたところ、重複を許可しなくてもソートしてくれないくなりました・・・
どこか考え方間違えたでしょうか・・・?

かなたん

Re: クイックソートを作っているのですが。

#13

投稿記事 by かなたん » 13年前

rがlより左に行ってしまうことがありました・・・
以下のように変更してみたところ、重複不可だと5でも50でも100でもソートしてくれるのですが、重複可だと7以上だと動作が停止してしまいます・・・

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int number[100];
int items;

void quicksort(int s,int l,int r);

int main(void){
	printf("乱数を行くいつ発生させますか?\n(2~100)\n");
	scanf("%d",&items);
	int mode;
	printf("数字の重複を許しますか?\n1.重複可 0.重複不可\n");
	scanf("%d",&mode);
	printf("乱数発生中\n");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=false;
				while(check==false){
					number[n]=rand()%items+1;
					check=true;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=false;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	int s=0,l=1,r=items-1;
	for(s=0;s<items;s++){
		if(s+1<items){
			l=s+1;
		}
		else{
			l=s;
		}
		r=items-1;
		quicksort(s,l,r);
		printf("途中経過\n");
		for(int n=0;n<items;n++){
			printf("%d ",number[n]);
		}
		printf("\n");
	}
	printf("ソート終了\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void quicksort(int s,int l,int r){
	if(l!=r){
		while(number[l]<number[s]){
			if(l!=r && l<items-1){
				l++;
			}
			else{
				break;
			}
		}
		while(number[r]>number[s]){
			if(r!=l && r>1){
				r--;
			}
			else{
				break;
			}
		}
		if(l!=r){
			int tmp=number[l];
			number[l]=number[r];
			number[r]=tmp;
		}
		else{
			if(number[s]<number[l]){
				int tmp=number[s];
				number[s]=number[l-1];
				number[l-1]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(r>1 && r-2>=s && r-2>=l){
					r=r-2;
				}
				else{
					r=l;
				}
			}
			else{
				int tmp=number[s];
				number[s]=number[l];
				number[l]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(r>0 && r-1>=s && r-1>=l){
					r=r-1;
				}
				else{
					r=l;
				}
			}
		}
		quicksort(s,l,r);
	}
}

かなたん

Re: クイックソートを作っているのですが。

#14

投稿記事 by かなたん » 13年前

要素数がいくつであろうと数字が3つ以上重複すると―s,l,rがすべて同じ値になってしまったときスタックオーバーフローを引き起こすために、重複可にするとうまくいかないということが分かりました。
この場合は・・・s,l,rがすべて同じ値になったときにlかrどちらかをずらせば大丈夫でしょうか・・・?

かなたん

Re: クイックソートを作っているのですが。

#15

投稿記事 by かなたん » 13年前

s,l,r番目の値がすべて一致してしまったときにはlを1ずらすことでスタックオーバーフローになるのを防ぎました。
そして、ソート終了まで行ったのでうまくできたんだと思っていたのですが、26 25 26や44 45 44などのきちんとソートできていない個所がありました。

プログラムコード

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int number[100];
int items;

void quicksort(int s,int l,int r);

int main(void){
	printf("乱数を行くいつ発生させますか?\n(2~100)\n");
	scanf("%d",&items);
	int mode;
	printf("数字の重複を許しますか?\n1.重複可 0.重複不可\n");
	scanf("%d",&mode);
	printf("乱数発生中\n");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=false;
				while(check==false){
					number[n]=rand()%items+1;
					check=true;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=false;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	int s=0,l=1,r=items-1;
	for(s=0;s<items;s++){
		if(s+1<items){
			l=s+1;
		}
		else{
			l=s;
		}
		r=items-1;
		quicksort(s,l,r);
		printf("途中経過\n");
		for(int n=0;n<items;n++){
			printf("%d ",number[n]);
		}
		printf("\n");
	}
	printf("ソート終了\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void quicksort(int s,int l,int r){
	if(l!=r){
		while(number[l]<number[s]){
			if(l!=r && l<items-1){
				l++;
			}
			else{
				break;
			}
		}
		while(number[r]>number[s]){
			if(r!=l && r>1){
				r--;
			}
			else{
				break;
			}
		}
		if(l!=r){
			if(number[s]==number[l] && number[l]==number[r]){
				l++;
			}
			else{
				int tmp=number[l];
				number[l]=number[r];
				number[r]=tmp;
			}
		}
		else{
			if(number[s]<number[l]){
				int tmp=number[s];
				number[s]=number[l-1];
				number[l-1]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(r>1 && r-2>=s && r-2>=l){
					r=r-2;
				}
				else{
					r=l;
				}
			}
			else{
				int tmp=number[s];
				number[s]=number[l];
				number[l]=tmp;
				if(s+1<items){
					l=s+1;
				}
				else{
					l=s;
				}
				if(r>0 && r-1>=s && r-1>=l){
					r=r-1;
				}
				else{
					r=l;
				}
			}
		}
		quicksort(s,l,r);
	}
}
実行結果

コード:

乱数を行くいつ発生させますか?
(2~100)
50
数字の重複を許しますか?
1.重複可 0.重複不可
1
乱数発生中
乱数完成
1 7 9 4 45 24 20 8 37 36 19 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 3 30
 30 12 26 29 17 4 6 27 47 1 12 45 37 48 48 5 17 30 16 37 9
クイックソート開始
途中経過
1 1 9 4 45 24 20 8 37 36 19 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 3 30
 30 12 26 29 17 4 6 27 47 7 12 45 37 48 48 5 17 30 16 37 9
途中経過
1 1 9 4 45 24 20 8 37 36 19 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 3 30
 30 12 26 29 17 4 6 27 47 7 12 45 37 48 48 5 17 30 16 37 9
途中経過
1 1 3 4 5 7 6 8 4 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 7 6 8 5 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 7 6 8 5 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 36 42 47 38 22 40 22 26 44 32 40 27 42 27 34 25 19 30 30 1
2 26 29 17 36 37 27 47 20 12 45 37 48 48 24 17 30 16 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 24 22 26 22 32 20 27 27 27 34 25 19 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 24 22 26 22 32 20 27 27 27 34 25 19 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 24 22 26 22 32 20 27 27 27 34 25 19 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 24 22 26 22 32 20 27 27 27 34 25 19 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 24 22 26 22 32 20 27 27 27 34 25 19 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 32 27 27 27 34 25 26 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 32 27 27 27 34 25 26 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 32 27 27 27 34 25 26 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 32 27 27 27 34 25 26 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 32 27 27 27 34 25 26 30 30 3
0 26 29 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 29 27 27 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 29 27 27 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 29 27 27 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 42 47 40 44 45 37 48 48 40 38 47 42 37 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 44 45 47 48 48 40 38 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 44 45 47 48 48 40 38 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 44 45 47 48 48 40 38 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 47 48 48 45 44 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 47 48 48 45 44 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 47 48 48 45 44 47 42 42 45
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 45 44 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 45 44 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
途中経過
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
ソート終了
1 1 3 4 4 5 6 7 8 9 9 12 12 16 17 17 19 20 22 22 24 26 25 26 27 27 27 29 30 30 3
0 32 34 36 36 37 37 37 40 38 40 42 42 45 44 45 47 47 48 48
続行するには何かキーを押してください . . .
あと何が違うのでしょうか・・・?

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: クイックソートを作っているのですが。

#16

投稿記事 by YuO » 13年前

かなたん さんが書きました:あと何が違うのでしょうか・・・?
  • 途中経過をquicksortの最初で表示するようにする
  • lとrの範囲をわかるようにする
  • sがどれかわかるようにする
といったことをすると,問題点が見つかると思います。
# l + 1 == rの時にsとの交換が絶対に行われない。

根本的な話としては,クイックソートになっていないことでしょう。
  • 「数列」を「ピボットより小さい値,ピボット,ピボットより大きいの値」のように並べる。ピボット以外の2区間はこの時点での並び替えは不要
  • 「ピボットより小さい値」を「数列」としてクイックソート
  • 「ピボットより大きい値」を「数列」としてクイックソート
というのが,クイックソートの基本的なアルゴリズムです。
quicksort関数をループして呼び出さないといけない時点でクイックソートではありません。
# というか,ピボットを渡すような作りにはしないかと。
また,上記のように,クイックソートは内部でクイックソートを2回呼び出します。
# 普通はサンプルじゃなくてピボット (pivot) と言います。

かなたん

Re: クイックソートを作っているのですが。

#17

投稿記事 by かなたん » 13年前

YuO さんが書きました:
  • 途中経過をquicksortの最初で表示するようにする
  • lとrの範囲をわかるようにする
  • sがどれかわかるようにする
といったことをすると,問題点が見つかると思います。
# l + 1 == rの時にsとの交換が絶対に行われない。
わかりました。
その点を踏まえて試してみようと思います。
YuO さんが書きました:根本的な話としては,クイックソートになっていないことでしょう。
  • 「数列」を「ピボットより小さい値,ピボット,ピボットより大きいの値」のように並べる。ピボット以外の2区間はこの時点での並び替えは不要
  • 「ピボットより小さい値」を「数列」としてクイックソート
  • 「ピボットより大きい値」を「数列」としてクイックソート
というのが,クイックソートの基本的なアルゴリズムです。
quicksort関数をループして呼び出さないといけない時点でクイックソートではありません。
# というか,ピボットを渡すような作りにはしないかと。
また,上記のように,クイックソートは内部でクイックソートを2回呼び出します。
# 普通はサンプルじゃなくてピボット (pivot) と言います。
まだクイックソートとは言えないのですね。
サンプル・レフトポインタ・ライトポインタといういい方は、授業でそのように教わったのでそう言っているのです。
サンプル・レフトポインタ・ライトポインタを関数の引数にしているのも、先生にそのように作るように言われたからです。
「ネットで探せばサンプルを一番最初から真ん中に設定している物もあるけど、今回はそういうのではなくて一番左にしてほしい」とも言われています。
サンプルをfor文で決めてしまっているのは、どのように設定したらよいのかがわからなかったもので・・・

たいちう
記事: 418
登録日時: 14年前

Re: クイックソートを作っているのですが。

#18

投稿記事 by たいちう » 13年前

ピボット(サンプル)は本来引数として必要ないものなので、
lとrだけを引数にして完成させてから、sを追加することも可能です。
でも以降の説明は、ピボットを引数で渡す前提です。


> サンプルをfor文で決めてしまっているのは、
> どのように設定したらよいのかがわからなかったもので・・・

main関数からは1回だけ呼び出します。
先生が1番左にしろというのだから、quicksort(0, 1, 49)と呼び出せばよいのです。
「配列の0番目の要素をピボットとして、1番目から49番目をソートする」という意味です。

YuOさんも書いているように、これを
「ピボットより小さい値,ピボット,ピボットより大きいの値」のように並べます。
例として並び替えの結果、ピボットが配列の20番目になったとすると、
「配列の0番目の要素をピボットとして、1番目から19番目をソートする」、及び、
「配列の21番目の要素をピボットとして、22番目から49番目をソートする」
というように2つの部分に分けて呼び出します。

かなたん

Re: クイックソートを作っているのですが。

#19

投稿記事 by かなたん » 13年前

サンプル位置が決まったとき、その左側と右側をべっこに考えるんですよね。
左側はどんな時でもサンプル番目から確定したところの手前までですよね。
でも、右側は位確定したところの次から―一番最初は要素の最後までですが、ソートしていくうちに値はどんどん変わっていったりしますよね。
その右側の終わりをどうやって考えようか―ということで、もう1つソートしたいところの始まりと終わりを管理する関数partionを定義することにしました。
(この考え方はクイックソートから外れていないだろうか・・・?)
クイックソートを行っていく関数quicksortの戻り値をvoidからintに変えて、確定したところの位置をreturnするようにしました。
partionで引数である始めの位置(s)終わりの位置(e)に従ってs,l,rを決めてquicksortを呼び出し、その戻り値をsetで受け取る。
そのset,s,eに従って要素を左側と右側に分ける。
partionがquicksortを呼び出さなくなる条件は、左側や右側に分けたときに要素数が1以下になったら。
このようにすると先生が言っていた終端条件"s,l,rが一致したとき"と異なるけど、一応初めの要素数がいくつであろうと数字がいくつ重複しようときちんとソートできるようになりました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int *number;
int items;

void partion(int s,int e);
int quicksort(int s,int l,int r);

int main(void){
	printf("要素数を行くいつにしますか?\n(2~)\n");
	scanf("%d",&items);
	number=(int *)malloc(sizeof(int)*items);
	int mode;
	printf("数字の重複を許しますか?\n(1.許す 0.許さない)\n");
	scanf("%d",&mode);
	printf("乱数発生中\n");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=true;
				while(check==true){
					number[n]=rand()%items+1;
					check=false;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=true;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
		default:
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	partion(0,items-1);
	printf("ソート終了\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void partion(int s,int e){
	int set=quicksort(s,s+1,e);
	if(set-1>s){
		partion(s,set-1);
	}
	if(set+1<e){
		partion(set+1,e);
	}
}
int quicksort(int s,int l,int r){
	printf("途中経過\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	while(number[l]<=number[s]){
		if(l!=r && l<items-1){
			l++;
		}
		else{
			break;
		}
	}
	while(number[r]>=number[s]){
		if(r!=l && r>1){
			r--;
		}
		else{
			break;
		}
	}
	if(l!=r){
			int tmp=number[l];
			number[l]=number[r];
			number[r]=tmp;
	}
	else{
		if(number[s]<number[l]){
			int tmp=number[s];
			number[s]=number[l-1];
			number[l-1]=tmp;
			return l-1;
		}
		else{
			int tmp=number[s];
			number[s]=number[l];
			number[l]=tmp;
			return l;
		}
	}
	quicksort(s,l,r);
}
実行例(要素数:50 重複:可)

コード:

要素数を行くいつにしますか?
(2~)
50
数字の重複を許しますか?
(1.許す 0.許さない)
1
乱数発生中
乱数完成
28 35 41 15 34 35 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
 48 37 5 13 43 26 36 28 2 45 49 43 38 35 46 25 24 43 34 35 46
クイックソート開始
途中経過
28 35 41 15 34 35 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
 48 37 5 13 43 26 36 28 2 45 49 43 38 35 46 25 24 43 34 35 46
途中経過
28 24 41 15 34 35 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
 48 37 5 13 43 26 36 28 2 45 49 43 38 35 46 25 35 43 34 35 46
途中経過
28 24 25 15 34 35 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
 48 37 5 13 43 26 36 28 2 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 35 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
48 37 5 13 43 26 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 45 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
48 37 5 13 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 37 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9
48 37 5 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 39 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 9 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 31 7 37 19 33 18 12 31 44 45 2 19 26 20 12 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 12 7 37 19 33 18 12 31 44 45 2 19 26 20 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 33 18 12 31 44 45 2 19 26 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 31 44 45 2 19 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 19 44 45 2 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
28 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 19 2 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 19 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 24 25 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 19 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 24 19 15 2 26 4 13 5 7 24 2 9 12 7 20 19 26 18 12 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 24 19 15 2 12 4 13 5 7 24 2 9 12 7 20 19 26 18 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 24 19 15 2 12 4 13 5 7 24 2 9 12 7 20 19 18 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 18 19 15 2 12 4 13 5 7 24 2 9 12 7 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 18 7 15 2 12 4 13 5 7 24 2 9 12 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 18 7 15 2 12 4 13 5 7 12 2 9 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 9 7 15 2 12 4 13 5 7 12 2 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 9 7 2 2 12 4 13 5 7 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 9 7 2 2 7 4 13 5 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 9 7 2 2 7 4 5 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 5 7 2 2 7 4 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 5 4 2 2 7 7 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 4 2 5 7 7 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 4 2 5 7 7 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 13 12 12 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 24 19 20 19 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 26 26 25 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 45 44 31 33 37 31 39 4
8 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 35 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 45 44 31 33 37 31 39 3
5 37 37 45 43 35 36 28 34 45 49 43 38 35 46 41 35 43 34 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 45 44 31 33 37 31 39 3
5 37 37 45 43 35 36 28 34 45 34 43 38 35 46 41 35 43 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 45 44 31 33 37 31 39 3
5 37 37 45 43 35 36 28 34 45 34 43 38 35 43 41 35 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 35 44 31 33 37 31 39 3
5 37 37 45 43 35 36 28 34 45 34 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 35 34 31 33 37 31 39 3
5 37 37 45 43 35 36 28 34 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 35 34 31 33 34 31 39 3
5 37 37 45 43 35 36 28 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 35 34 31 33 34 31 28 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 35 34 31 33 34 31 28 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 34 31 33 34 31 35 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 34 31 33 34 31 35 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 37 37 45 43 35 36 39 37 45 44 43 38 35 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 37 37 35 43 35 36 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 37 37 35 36 35 43 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 37 35 36 37 43 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 37 35 36 37 43 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 36 35 37 37 43 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 43 39 37 45 44 43 38 45 43 41 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 43 39 37 41 44 43 38 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 43 39 37 41 38 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 43 39 37 41 38 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 38 39 37 41 43 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 38 37 39 41 43 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 44 45 43 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 44 43 45 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 43 44 45 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 43 44 45 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 43 44 45 45 45 46 49 48 46
途中経過
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 43 44 45 45 45 46 46 48 49
ソート終了
2 2 2 4 5 7 7 9 12 12 13 15 18 19 19 20 24 24 25 26 26 28 28 31 31 33 34 34 35 3
5 35 35 36 37 37 37 38 39 41 43 43 43 44 45 45 45 46 46 48 49
続行するには何かキーを押してください . . .
再帰関数の終端条件を"s,l,rが一致したとき"にするためには、partion関数のようなものは使わないでできるようにするべきなのでしょうか?
今のpartionの引数をs,l,rにする必要はないでしょうし・・・
quicksortの引数に終わりの位置を追加すれば―というのは違うでしょうし・・・

とりあえず、私が自分の手でクイックソートを行ってみたときのを載せておきます。
quicksort_idea.xls

たいちう
記事: 418
登録日時: 14年前

Re: クイックソートを作っているのですが。

#20

投稿記事 by たいちう » 13年前

あまり人の話を聞かない人のようですね。
YuOさんも私もquicksortからquicksortを2回呼び出すように書いているはずです。
全ての回答を頻繁に注意深く読み返す習慣を付けて下さい。


> (この考え方はクイックソートから外れていないだろうか・・・?)

外れています。partionはやめて下さい。
mainからは下のような形の関数を1回だけ呼び出して下さい。

コード:

void quicksort(int s, int l, int r) {
	// 終了条件
	if (...) return;

	// ピボットを使った大雑把なソート
	...

	// ピボットよりも小さいデータのソート
	quicksort(s2, l2, r2);

	// ピボットよりも大きいデータのソート
	quicksort(s3, l3, r3);
}
かなたんさんのquicksort関数で大きな勘違いをしているのは、
1回の関数呼び出しにつき、1回しかswapをしていない事です。
上記の「ピボットを使った大雑把なソート」の直後で、配列を表示してみてください。
ここで「ピボットより小さい値,ピボット,ピボットより大きいの値」となってないといけません。
当然1回のswapではこうなりませんので、quicksort関数内にforやwhileでループが必要です。

かなたん

Re: クイックソートを作っているのですが。

#21

投稿記事 by かなたん » 13年前

たいちう さんが書きました:あまり人の話を聞かない人のようですね。
YuOさんも私もquicksortからquicksortを2回呼び出すように書いているはずです。
全ての回答を頻繁に注意深く読み返す習慣を付けて下さい。
すいません・・・
引数をどのようにして読んだらいいのかが分かってなくて・・・
たいちう さんが書きました:外れています。partionはやめて下さい。
mainからは下のような形の関数を1回だけ呼び出して下さい。

コード:

void quicksort(int s, int l, int r) {
	// 終了条件
	if (...) return;

	// ピボットを使った大雑把なソート
	...

	// ピボットよりも小さいデータのソート
	quicksort(s2, l2, r2);

	// ピボットよりも大きいデータのソート
	quicksort(s3, l3, r3);
}
かなたんさんのquicksort関数で大きな勘違いをしているのは、
1回の関数呼び出しにつき、1回しかswapをしていない事です。
上記の「ピボットを使った大雑把なソート」の直後で、配列を表示してみてください。
ここで「ピボットより小さい値,ピボット,ピボットより大きいの値」となってないといけません。
当然1回のswapではこうなりませんので、quicksort関数内にforやwhileでループが必要です。
ソートしたい範囲をどうやって持っていようか・・・と思っていたのですが、そのようにすればquicksort関数だけでできますね。
というわけで、作ってみました。
今度こそクイックソートですよね?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int *number;
int items;

void quicksort(int s,int l,int r);

int main(void){
	printf("要素数を行くいつにしますか?\n(2~)\n");
	scanf("%d",&items);
	number=(int *)malloc(sizeof(int)*items);
	int mode;
	printf("数字の重複を許しますか?\n(1.許す 0.許さない)\n");
	scanf("%d",&mode);
	printf("乱数発生中\n");
	srand((unsigned)time(NULL));
	switch(mode){
		case 0:
			number[0]=rand()%items+1;
			for(int n=1;n<items;n++){
				bool check=true;
				while(check==true){
					number[n]=rand()%items+1;
					check=false;
					for(int m=n-1;m>=0;m--){
						if(number[n]==number[m]){
							check=true;
							break;
						}
					}
				}
			}
			break;
		case 1:
			for(int n=0;n<items;n++){
				number[n]=rand()%items+1;
			}
			break;
		default:
			break;
	}
	printf("乱数完成\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	printf("クイックソート開始\n");
	quicksort(0,1,items-1);
	printf("ソート終了\n");
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	return 0;
}
void quicksort(int s,int l,int r){
	printf("途中経過 (s=%d l=%d r=%d)\n",s,l,r);
	for(int n=0;n<items;n++){
		printf("%d ",number[n]);
	}
	printf("\n");
	int first=s,end=r;
	if(s!=l || l!=r){
		while(l!=r){
		while(number[l]<=number[s]){
			if(l!=r && l<items-1){
				l++;
			}
			else{
				break;
			}
		}
		while(number[r]>=number[s]){
			if(r!=l && r>1){
				r--;
			}
			else{
				break;
			}
		}
			int tmp=number[l];
			number[l]=number[r];
			number[r]=tmp;
		}
		if(number[s]<number[l]){
			int tmp=number[s];
			number[s]=number[l-1];
			number[l-1]=tmp;
			printf("途中経過 (s=%d l=%d r=%d l-1=%d first=%d end=%d)\n",s,l,r,l-1,first,end);
			for(int n=0;n<items;n++){
				printf("%d ",number[n]);
			}
			printf("\n");
			if(first+1==l-1){
				quicksort(first,first,first);
			}
			else if(first!=l-1){
				quicksort(first,first+1,l-2);
			}
			if(end-1==l-1){
				quicksort(end,end,end);
			}
			else{
				quicksort(l,l+1,end);
			}
		}
		else{
			int tmp=number[s];
			number[s]=number[l];
			number[l]=tmp;
			printf("途中経過 (s=%d l=%d r=%d l=%d first=%d end=%d)\n",s,l,r,l,first,end);
			for(int n=0;n<items;n++){
				printf("%d ",number[n]);
			}
			printf("\n");
			if(first+1==l){
				quicksort(first,first,first);
			}
			else{
				quicksort(first,first+1,l-1);
			}
			if(end-1==l){
				quicksort(end,end,end);
			}
			else if(end!=l){
				quicksort(l+1,l+2,end);
			}
		}
	}
	else{
		return;
	}
}
実行結果 要素数:50 重複を許さない

コード:

要素数を行くいつにしますか?
(2~)
50
数字の重複を許しますか?
(1.許す 0.許さない)
0
乱数発生中
乱数完成
33 41 14 11 31 21 8 4 9 34 50 45 39 38 15 37 28 16 2 13 27 18 35 20 47 10 12 36
43 44 40 19 48 22 6 17 25 32 5 7 30 24 42 26 23 29 1 3 49 46
クイックソート開始
途中経過 (s=0 l=1 r=49)
33 41 14 11 31 21 8 4 9 34 50 45 39 38 15 37 28 16 2 13 27 18 35 20 47 10 12 36
43 44 40 19 48 22 6 17 25 32 5 7 30 24 42 26 23 29 1 3 49 46
途中経過 (s=0 l=33 r=33 l-1=32 first=0 end=49)
22 3 14 11 31 21 8 4 9 1 29 23 26 24 15 30 28 16 2 13 27 18 7 20 5 10 12 32 25 1
7 6 19 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=31)
22 3 14 11 31 21 8 4 9 1 29 23 26 24 15 30 28 16 2 13 27 18 7 20 5 10 12 32 25 1
7 6 19 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=22 r=22 l-1=21 first=0 end=31)
18 3 14 11 19 21 8 4 9 1 6 17 12 10 15 5 20 16 2 13 7 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=20)
18 3 14 11 19 21 8 4 9 1 6 17 12 10 15 5 20 16 2 13 7 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=18 r=18 l-1=17 first=0 end=20)
16 3 14 11 7 13 8 4 9 1 6 17 12 10 15 5 2 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=16)
16 3 14 11 7 13 8 4 9 1 6 17 12 10 15 5 2 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=16 r=16 l-1=15 first=0 end=16)
5 3 14 11 7 13 8 4 9 1 6 2 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=14)
5 3 14 11 7 13 8 4 9 1 6 2 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=5 r=5 l-1=4 first=0 end=14)
4 3 2 1 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=3)
4 3 2 1 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=3 r=3 l=3 first=0 end=3)
1 3 2 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=2)
1 3 2 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=0 l=1 r=1 l-1=0 first=0 end=2)
1 3 2 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=1 l=2 r=2)
1 3 2 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=1 l=2 r=2 l=2 first=1 end=2)
1 2 3 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=1 l=1 r=1)
1 2 3 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=6 r=14)
1 2 3 4 5 13 8 7 9 11 6 14 12 10 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=13 r=13 l-1=12 first=5 end=14)
1 2 3 4 5 12 8 7 9 11 6 10 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=6 r=11)
1 2 3 4 5 12 8 7 9 11 6 10 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=11 r=11 l=11 first=5 end=11)
1 2 3 4 5 10 8 7 9 11 6 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=6 r=10)
1 2 3 4 5 10 8 7 9 11 6 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=10 r=10 l-1=9 first=5 end=10)
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=6 r=8)
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=5 l=6 r=6 l-1=5 first=5 end=8)
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=6 l=7 r=8)
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=6 l=8 r=8 l-1=7 first=6 end=8)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=6 l=6 r=6)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=8 l=8 r=8)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=10 l=10 r=10)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=13 l=14 r=14)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=13 l=14 r=14 l-1=13 first=13 end=14)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=14 l=14 r=14)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=16 l=16 r=16)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=18 l=19 r=20)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=18 l=20 r=20 l-1=19 first=18 end=20)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=18 l=18 r=18)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=20 l=20 r=20)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=23 r=31)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 27 28 30 24 26 32 25 23
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=27 r=27 l-1=26 first=22 end=31)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 26 23 25 24 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=23 r=25)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 26 23 25 24 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=25 r=25 l=25 first=22 end=25)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 23 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=23 r=24)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 23 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=24 r=24 l-1=23 first=22 end=24)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=22 l=22 r=22)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=24 l=24 r=24)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=28 r=31)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 32 30 28
 29 31 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=31 r=31 l=31 first=27 end=31)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 31 30 28
 29 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=28 r=30)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 31 30 28
 29 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=30 r=30 l=30 first=27 end=30)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 28
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=28 r=29)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 28
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=29 r=29 l-1=28 first=27 end=29)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=27 l=27 r=27)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=29 l=29 r=29)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=33 l=34 r=49)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 48 40 44 43 36 47 35 37 38 42 39 45 50 34 41 49 46
途中経過 (s=33 l=48 r=48 l-1=47 first=33 end=49)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 41 40 44 43 36 47 35 37 38 42 39 45 46 34 48 49 50
途中経過 (s=33 l=34 r=46)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 41 40 44 43 36 47 35 37 38 42 39 45 46 34 48 49 50
途中経過 (s=33 l=41 r=41 l-1=40 first=33 end=46)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 37 40 34 39 36 38 35 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=34 r=39)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 37 40 34 39 36 38 35 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=37 r=37 l-1=36 first=33 end=39)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 36 35 34 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=34 r=35)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 36 35 34 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=35 r=35 l=35 first=33 end=35)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=34 r=34)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=33 l=34 r=34 l-1=33 first=33 end=34)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=34 l=34 r=34)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=37 l=38 r=39)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 39 38 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=37 l=39 r=39 l-1=38 first=37 end=39)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=37 l=37 r=37)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=39 l=39 r=39)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=41 l=42 r=46)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 47 42 43 45 46 44 48 49 50
途中経過 (s=41 l=46 r=46 l=46 first=41 end=46)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 44 42 43 45 46 47 48 49 50
途中経過 (s=41 l=42 r=45)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 44 42 43 45 46 47 48 49 50
途中経過 (s=41 l=44 r=44 l-1=43 first=41 end=45)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 43 42 44 45 46 47 48 49 50
途中経過 (s=41 l=42 r=42)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 43 42 44 45 46 47 48 49 50
途中経過 (s=41 l=42 r=42 l=42 first=41 end=42)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=41 l=41 r=41)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=44 l=45 r=45)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=44 l=45 r=45 l-1=44 first=44 end=45)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=45 l=45 r=45)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=48 l=49 r=49)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=48 l=49 r=49 l-1=48 first=48 end=49)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
途中経過 (s=49 l=49 r=49)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
ソート終了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
続行するには何かキーを押してください . . .
実行結果 要素数:50 重複を許す

コード:

要素数を行くいつにしますか?
(2~)
50
数字の重複を許しますか?
(1.許す 0.許さない)
1
乱数発生中
乱数完成
49 9 29 48 29 30 31 43 37 48 46 15 11 16 28 39 12 32 12 45 31 4 21 3 4 18 40 15
32 34 36 37 37 35 7 10 30 11 46 20 16 23 37 35 19 21 15 16 41 23
クイックソート開始
途中経過 (s=0 l=1 r=49)
49 9 29 48 29 30 31 43 37 48 46 15 11 16 28 39 12 32 12 45 31 4 21 3 4 18 40 15
32 34 36 37 37 35 7 10 30 11 46 20 16 23 37 35 19 21 15 16 41 23
途中経過 (s=0 l=49 r=49 l=49 first=0 end=49)
23 9 29 48 29 30 31 43 37 48 46 15 11 16 28 39 12 32 12 45 31 4 21 3 4 18 40 15
32 34 36 37 37 35 7 10 30 11 46 20 16 23 37 35 19 21 15 16 41 49
途中経過 (s=0 l=1 r=48)
23 9 29 48 29 30 31 43 37 48 46 15 11 16 28 39 12 32 12 45 31 4 21 3 4 18 40 15
32 34 36 37 37 35 7 10 30 11 46 20 16 23 37 35 19 21 15 16 41 49
途中経過 (s=0 l=22 r=22 l-1=21 first=0 end=48)
4 9 16 15 21 19 16 20 11 10 7 15 11 16 15 18 12 4 12 3 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=0 l=1 r=20)
4 9 16 15 21 19 16 20 11 10 7 15 11 16 15 18 12 4 12 3 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=0 l=2 r=2 l-1=1 first=0 end=20)
3 4 16 15 21 19 16 20 11 10 7 15 11 16 15 18 12 4 12 9 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=0 l=0 r=0)
3 4 16 15 21 19 16 20 11 10 7 15 11 16 15 18 12 4 12 9 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=3 r=20)
3 4 16 15 21 19 16 20 11 10 7 15 11 16 15 18 12 4 12 9 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=16 r=16 l-1=15 first=2 end=20)
3 4 12 15 9 12 16 4 11 10 7 15 11 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=3 r=14)
3 4 12 15 9 12 16 4 11 10 7 15 11 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=10 r=10 l-1=9 first=2 end=14)
3 4 10 11 9 12 7 4 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=3 r=8)
3 4 10 11 9 12 7 4 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=6 r=6 l-1=5 first=2 end=8)
3 4 7 4 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=3 r=4)
3 4 7 4 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=4 r=4 l-1=3 first=2 end=4)
3 4 4 7 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=2 l=2 r=2)
3 4 4 7 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=4 l=4 r=4)
3 4 4 7 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=6 l=7 r=8)
3 4 4 7 9 10 12 11 11 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=6 l=8 r=8 l=8 first=6 end=8)
3 4 4 7 9 10 11 11 12 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=6 l=7 r=7)
3 4 4 7 9 10 11 11 12 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=6 l=7 r=7 l=7 first=6 end=7)
3 4 4 7 9 10 11 11 12 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=6 l=6 r=6)
3 4 4 7 9 10 11 11 12 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=11 r=14)
3 4 4 7 9 10 11 11 12 12 16 15 15 16 15 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=14 r=14 l=14 first=10 end=14)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=11 r=13)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=13 r=13 l-1=12 first=10 end=13)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=11 r=11)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=11 r=11 l=11 first=10 end=11)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=10 l=10 r=10)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=13 l=13 r=13)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=16 l=17 r=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=16 l=17 r=17 l-1=16 first=16 end=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=17 l=18 r=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 20 19 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=17 l=19 r=19 l-1=18 first=17 end=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=17 l=17 r=17)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=19 l=20 r=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=19 l=20 r=20 l=20 first=19 end=20)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=19 l=19 r=19)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=22 l=23 r=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 31 45 32 39 40 28 3
2 34 36 37 37 35 46 48 30 37 46 43 31 23 37 35 30 29 48 29 41 49
途中経過 (s=22 l=29 r=29 l-1=28 first=22 end=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 30 29 29 30 23 28 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=22 l=23 r=27)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 30 29 29 30 23 28 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=22 l=27 r=27 l=27 first=22 end=27)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 28 29 29 30 23 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=22 l=23 r=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 28 29 29 30 23 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=22 l=24 r=24 l-1=23 first=22 end=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 30 29 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=22 l=22 r=22)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 30 29 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=24 l=25 r=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 30 29 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=24 l=25 r=25 l-1=24 first=24 end=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 30 29 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=25 l=26 r=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 30 29 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=25 l=26 r=26 l=26 first=25 end=26)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=25 l=25 r=25)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=29 l=30 r=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 34 36 37 37 35 46 48 32 37 46 43 31 40 37 35 39 32 48 45 41 49
途中経過 (s=29 l=33 r=33 l-1=32 first=29 end=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 32 32 31 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=29 l=30 r=31)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 32 32 31 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=29 l=31 r=31 l=31 first=29 end=31)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=29 l=30 r=30)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=29 l=30 r=30 l-1=29 first=29 end=30)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=30 l=30 r=30)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=33 l=34 r=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=33 l=34 r=34 l-1=33 first=33 end=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=34 l=35 r=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 46 48 37 37 46 43 37 40 37 35 39 36 48 45 41 49
途中経過 (s=34 l=47 r=47 l-1=46 first=34 end=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 45 41 37 37 46 43 37 40 37 35 39 36 46 48 48 49
途中経過 (s=34 l=35 r=45)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 45 41 37 37 46 43 37 40 37 35 39 36 46 48 48 49
途中経過 (s=34 l=45 r=45 l-1=44 first=34 end=45)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 39 41 37 37 36 43 37 40 37 35 45 46 46 48 48 49
途中経過 (s=34 l=35 r=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 39 41 37 37 36 43 37 40 37 35 45 46 46 48 48 49
途中経過 (s=34 l=41 r=41 l-1=40 first=34 end=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 37 35 37 37 36 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=35 r=39)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 37 35 37 37 36 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=39 r=39 l=39 first=34 end=39)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 37 35 37 37 36 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=35 r=38)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 37 35 37 37 36 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=38 r=38 l=38 first=34 end=38)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 36 35 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=35 r=37)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 36 35 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=36 r=36 l-1=35 first=34 end=37)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=34 l=34 r=34)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=36 l=37 r=37)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=36 l=37 r=37 l=37 first=36 end=37)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=36 l=36 r=36)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=41 l=42 r=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=41 l=42 r=42 l-1=41 first=41 end=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=42 l=43 r=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 43 41 45 46 46 48 48 49
途中経過 (s=42 l=43 r=43 l=43 first=42 end=43)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
途中経過 (s=42 l=42 r=42)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
途中経過 (s=45 l=45 r=45)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
途中経過 (s=47 l=48 r=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
途中経過 (s=47 l=48 r=48 l=48 first=47 end=48)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
途中経過 (s=47 l=47 r=47)
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
ソート終了
3 4 4 7 9 10 11 11 12 12 15 15 15 16 16 16 18 19 20 21 21 23 23 28 29 29 30 30 3
1 31 32 32 34 35 35 36 37 37 37 37 39 40 41 43 45 46 46 48 48 49
続行するには何かキーを押してください . . .
クイックソートってこういうことですよね?

これと別に最初やっていたようにMFCでも作りたいんです。
ソートの表示は、画面に要素をブロックとして表示したいと思っています。
処理が遅くなるとかどうとかは別にして、入れ替えなどの要素の変化を一定時間ごとに表示(画面更新)させたいんです。
途中で勝手にreturnを入れてしまおうかとも思いましたが、そんなことをしてもよいのだろうかと・・・
(うまく動くのだろうか?というか、ソートできたとしても本来の動きと違ってしまわないだろうか?とか)
関数内でSleepを使うのもどうなのかなとか思っていたりも。
クイックソートでこのようなことをするのはあきらめた方がいいでしょうか?
バブルソートや最小値選択法などはfor文で関数を呼び出したりできるソートだったので、このようなことが普通にできたのですが。

閉鎖

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