クイックソートで

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
名無し

クイックソートで

#1

投稿記事 by 名無し » 14年前

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void quick(int *, int, int);

#define N 10

int main(void){
int a[N] = {0};
int k = 0;

for (k = 0; k < N ; k++) {
printf("Input a number: ");
scanf("%d", &a[k]);
}

printf("before: ");
for (k = 0; k < N; k++) {
printf("%4d", a[k]);
}
printf("\n");

quick(a, 0, N - 1);

printf("after: ");
for (k = 0; k < N; k++) {
printf("%4d", a[k]);
}
printf("\n");
}

void check(int a[], int left, int right, int p, int center) {
int i = 0;
printf("(%d, %d) pivot: %d, center: %d\n", left, right, p, center);
for (i = 0; i < N; i++) {
printf("%4d", a);
}
printf("\n");
}

int pivot(int a[], int left, int right) {
return left;
}

int swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}

int partition(int a[], int left, int right, int p) {

//
(* ここに解答を書き加える *)


}

void quick(int a[], int left, int right) {

//
(* ここに解答を書き加える *)


check(a, left, right, p, center);
quick(a, left, center - 1);
quick(a, center, right);
}





という課題で




int partition(int a[], int left, int right, int p) {

int i,j;
i=left; j=right;
p = pivot(a,left,right);

while (1) {
while (p > a)
i++;
while (p < a[j])
j--;
if (i >= j)
break;
swap(&a, &a[j]);
i++;
j--;
}

swap(&a[left],&a[j]);

return(i);


}


void quick(int a[], int left, int right) {

int p = pivot(a, left, right);
int center = partition(a, left, right, a[p]);
check(a, left, right, p, center);
quick(a, left, center - 1);
quick(a, center, right);
}


こう書いてみたんですが無限ループしてしまいソートできません
どこが間違ってるんだようか?

nanasi

Re: クイックソートで

#2

投稿記事 by nanasi » 14年前

int partition(int a[], int left, int right, int p) {

int l,r;
l=left; r=right;

while(l<=r){

while (l<=right && a[l]<p)
l++;
while (r>=left && a[r]>=p)
r--;
if (l>=r)
break;
swap(&a[l], &a[r]);
l++;
r--;
}
swap(&a[left],&a[r]);
return(l);


}


void quick(int a[], int left, int right) {
if(left == right)
return;
int p = pivot(a, left, right);
int center = partition(a, left, right, a[p]);



check(a, left, right, p, center);
quick(a, left, center - 1);
quick(a, center, right);


}


書き直してみたけどやはり無限ループ
どこがループしてるのでしょうか

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: クイックソートで

#3

投稿記事 by h2so5 » 14年前

大元の原因は分かりませんが、
いつまでも left == right の条件が満たされないので無限に再帰呼び出しをしているようです。

閉鎖

“C言語何でも質問掲示板” へ戻る