#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);
}
こう書いてみたんですが無限ループしてしまいソートできません
どこが間違ってるんだようか?
クイックソートで
Re: クイックソートで
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);
}
書き直してみたけどやはり無限ループ
どこがループしてるのでしょうか
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);
}
書き直してみたけどやはり無限ループ
どこがループしてるのでしょうか
Re: クイックソートで
大元の原因は分かりませんが、
いつまでも left == right の条件が満たされないので無限に再帰呼び出しをしているようです。
いつまでも left == right の条件が満たされないので無限に再帰呼び出しをしているようです。