クイックソートプログラム と 再帰関数

クイックソート解説アプリ
  ダウンロード (win7対応)
            ソースコード


クイックソートプログラムアルゴリズムの概念から、
プログラム処理内容まで事細かく、
わかりやすく解説したソフトです。

みんながつまづき易い再帰関数の説明を極力丁寧に解説し、
とにかく「
わかりやすく」に重点を置いて
再帰関数を用いたクイックソートアルゴリズムを解説しています。

再帰関数に力をいれて解説していますから、
再帰関数の勉強のために使うのも◎!

C言語を用いていますが、最初は概念の説明から入るので、
JAVAでも、VBでも、どんな言語でも対応出来ます。



キャラクターが自分に講義してくれているようなシュチュエーションで、

動的なアルゴリズムも、動きのある解説で楽々判ります。



今どの変数に何が入っているか、常に自動変数を確認しながら、

プログラムと平行してクイックソートのプログラムが理解できます。



クイックソートの概念の解説から、実際に書くプログラムの内容まで

細かく丁寧に解説してくれるため、複雑なプログラムも

誰にでも必ず理解できます。

料金は無料です♪

私が以前とても再帰関数とクイックソートで悩んだので、

今勉強している人には、苦労せず、学んで欲しいと思って作りました☆

是非クイックソート解説アプリを使ってみてください。

使用してくださった方は是非掲示板で一言報告してください♪


操作方法

エンター:話を進める。
バックスペース:話を戻す。
Esc:強制終了

上記「ダウンロード」から本体をダウンロードしてください。

ダウンロードしたファイルを解凍してください。

解凍したフォルダの中の「Ap_sort(.exe)」をダブルクリックして実行してください。



アプリ内でのプログラムはスペースを削減するために

見た目よりスペースを気にしたプログラムになっているので

読みにくかったと思います。

以下にきちんとしたプログラムを書いておきますので参考にしてください。


バグ修正・アップロード履歴

11/16 ver 1.10 バックミュージックを変更

11/16 ver-1.01 矢印の位置が移動するバグを修正


お暇があれば
クイックソート解説アプリ作成ストーリー
などもどうぞ



ソースコード

/*
クイックソートソースコード
      
アプリ本編では、グローバル変数を用いてx[ ]を利用しましたが、
      
あれは、プログラムを簡略化するためであり、プログラムとしては以下のようにローカル変数を用いたほうがよいでしょう。
      
x[ ]の配列要素数はsizeof関数によって要素数が何個であるか調査できるので、その処理を追加してあります。

change関数は、swapと名前をつけるのが一般的ですが、sortと頭文字が被ってしまうので、change関数と名づけています。

アプリのピクセルサイズが小さいので極力ソースコードを短くする必要があったんですね。

*/
      
#include  <stdio.h>

void change(int i,int j, int x[ ]){//配列要素i番目とj番目の値を入れ替える
	int t;
	t=x[i];
	x[i]=x[j];
	x[j]=t;
}

void sort(int l, int r, int x[ ]){//lを一番左端の配列要素、rを一番右端の要素としてソートする。
	int i,j,p;

	i=l;j=r;
	p=x[(l+r)/2];//ピボットの決定

	while(1) {
		while(x[i]<p){//左からピボット以上を探索
			i++;
		}
		while(p<x[j]){//右からピボット以下を探索
			j--;
		}
		if(i>=j){//探索地点がぶつかったら終了
			break;
                }
                change(i,j,x);//お互い発見した値をいれかえる
		i++;
		j--;
	}

	if(l<i-1){//左範囲が分割可能なら
                sort(l,i-1,x);//左範囲を分割してソートを行う
	}
	if(j+1<r){//右範囲が分割可能なら
                sort(j+1,r,x);//右範囲を分割してソートを行う
	}
}

int main(void){	
	int num , x[ ]={6,3,1,7,5,4,8,5,2,9};

        num=sizeof(x)/sizeof(x[0]);//配列の数を計算

        sort(0, num-1, x);//番号は0から始まるので、配列要素数-1を右端に指定してソート

        for(int i=0;i<num;i++)//ソート結果表示
                printf("%d ",x[i]);

        return 0;
}