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