サンプル位置が決まったとき、その左側と右側をべっこに考えるんですよね。
左側はどんな時でもサンプル番目から確定したところの手前までですよね。
でも、右側は位確定したところの次から―一番最初は要素の最後までですが、ソートしていくうちに値はどんどん変わっていったりしますよね。
その右側の終わりをどうやって考えようか―ということで、もう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