ページ 11

同じ要素を持つデータのクイックソート

Posted: 2007年12月07日(金) 22:21
by skyline
クイックソートを行うために以下(三番目の投稿)のプログラムを作成しましたが、
ソートデータに同じ要素があると止まってしまいます。
どこを改善すればいいかアドバイスをください。
できれば大きな変更がない方法がいいです。
よろしくお願いします。

Re:同じ要素を持つデータのクイックソート

Posted: 2007年12月07日(金) 22:34
by box
申し訳ありませんが、以下の点を考慮したコードを投稿していただけますか?

1)ヘッダーファイルやmain関数など、実行形式を作るのに必要な情報をすべて提示する。
2)コードの字下げは全角空白でなく、タブやスペースを使い、
  HTMLの<pre>タグと</pre>タグで挟む(< と >は、半角)。

Re:同じ要素を持つデータのクイックソート

Posted: 2007年12月07日(金) 22:53
by skyline
失礼いたしました。見た目だけを考え、全角スペースで代用していました。
再びよろしくお願いします。

=========================================================================
#include<stdio.h>
void quick_sort(int data[/url],int head,int tail);

int main(void){
	int data1[/url] = {10, 15, 13, 19, 8, 6, 3, 5, 11, 21}; 
	int data2[/url] = {4, 21, 1, -15, -21, 6, 4, 8, 2, 19};
	int data3[/url] = {5, 3, 2, -4, -6, 11, -12, -13, -22, 17};

	int i,j,k;
	int *p;
	
	for(k=0;k<3;k++){
		if(k==0){
			p=data1;
		}else if(k==1){
			p=data2;
		}else{
			p=data3;
		}
		quick_sort(p,0,9);
		printf("data %d = ",k+1);
		for(i=0;i<=9;i++){
			printf("%d  ",*(p++));
		}
		printf("\n");
	}
	return 0;
}

void quick_sort(int data[/url],int head,int tail){
	int x,y,st,tmp;
	if(tail-head<=1){
		return;
	}else{
		st=data[head];
		x=head;
		y=tail;
		while(x<y){
			while(data[x]<st){
				x++;
			}
			while(data[y]>st){
				y--;
			}
			if(x<y){
				tmp=data[x];
				data[x]=data[y];
				data[y]=tmp;
			}
		}

		if(x==y){
			quick_sort(data,head,x-1);
			quick_sort(data,x+1,tail);
		}else{
			quick_sort(data,head,y);
			quick_sort(data,x,tail);
		}
		
	}
}

Re:同じ要素を持つデータのクイックソート

Posted: 2007年12月08日(土) 00:12
by box
ちょっと書き換えてみました。


#include <stdio.h>

#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))

void quick_sort(int *data, int head, int tail);

int main(void)
{
	int data[/url][10] = {
		{10, 15, 13,  19,   8,  6,   3,   5,  11, 21},
		{ 4, 21,  1, -15, -21,  6,   4,   8,   2, 19},
		{ 5,  3,  2,  -4,  -6, 11, -12, -13, -22, 17}
	};
	int i, j;
	
	for (i = 0; i < SIZE(data); i++) {
		quick_sort(data, 0, SIZE(data)-1);
		printf("data %d = ", i + 1);
		for (j = 0; j < SIZE(data); j++)
			printf("%d  ", data[j]);
		printf("\n");
	}
	return 0;
}

void quick_sort(int *data, int head, int tail)
{
	int x, y, st, tmp;
	
	st = data[head];
	x = head;
	y = tail;
	do {
		while (data[x] < st)
			x++;
		while (data[y] > st)
			y--;
		if (x <= y) {
			tmp = data[x];
			data[x] = data[y];
			data[y] = tmp;
			x++;
			y--;
		}
	} while (x <= y);
	if (head < y)
		quick_sort(data, head, y);
	if (x < tail)
		quick_sort(data, x, tail);
}

Re:同じ要素を持つデータのクイックソート

Posted: 2007年12月08日(土) 01:30
by 管理人
よかったらアプリの方もご覧下さい。
http://dixq.net/sort.html

回答ありがとうございました

Posted: 2007年12月08日(土) 17:27
by skyline
boxさん
ソースを参考にいろいろと学んでみます。
上のようにsizeofを使うと、二次元配列の列のサイズを求めれるんですね。
クイックソートの関数も断然わかりやすいです。
ありがとうございました。



管理人さん
アプリのほうも見て学びたいと思います。
ありがとうございました。