クイックソートを行うために以下(三番目の投稿)のプログラムを作成しましたが、
ソートデータに同じ要素があると止まってしまいます。
どこを改善すればいいかアドバイスをください。
できれば大きな変更がない方法がいいです。
よろしくお願いします。
同じ要素を持つデータのクイックソート
-
box
Re:同じ要素を持つデータのクイックソート
申し訳ありませんが、以下の点を考慮したコードを投稿していただけますか?
1)ヘッダーファイルやmain関数など、実行形式を作るのに必要な情報をすべて提示する。
2)コードの字下げは全角空白でなく、タブやスペースを使い、
HTMLの<pre>タグと</pre>タグで挟む(< と >は、半角)。
1)ヘッダーファイルやmain関数など、実行形式を作るのに必要な情報をすべて提示する。
2)コードの字下げは全角空白でなく、タブやスペースを使い、
HTMLの<pre>タグと</pre>タグで挟む(< と >は、半角)。
-
skyline
Re:同じ要素を持つデータのクイックソート
失礼いたしました。見た目だけを考え、全角スペースで代用していました。
再びよろしくお願いします。
=========================================================================
再びよろしくお願いします。
=========================================================================
#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);
}
}
}-
box
Re:同じ要素を持つデータのクイックソート
ちょっと書き換えてみました。
#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);
}-
skyline
回答ありがとうございました
boxさん
ソースを参考にいろいろと学んでみます。
上のようにsizeofを使うと、二次元配列の列のサイズを求めれるんですね。
クイックソートの関数も断然わかりやすいです。
ありがとうございました。
管理人さん
アプリのほうも見て学びたいと思います。
ありがとうございました。
ソースを参考にいろいろと学んでみます。
上のようにsizeofを使うと、二次元配列の列のサイズを求めれるんですね。
クイックソートの関数も断然わかりやすいです。
ありがとうございました。
管理人さん
アプリのほうも見て学びたいと思います。
ありがとうございました。