#include <stdio.h>
#include <stdlib.h>
void quick(int *A,int left,int right,int k);
void print(int *A);
void swap(int *A,int x,int y);
int indexPivot,n,tmp;
int main()
{
int i,A[50],k;
printf("\n\n\n Size??\t\t");
scanf("%d",&n);
for(i=0;i<n;i++){
printf(" %d. eleMent...\t",i+1);
scanf("%d",&A[i]);
}
printf("\n 1 or 2 ");//another method but 1 is important now,not 2
scanf("%d",&k);
printf("\n First appearance ");
print(A);
quick(A,0,n-1,k);
printf(" \nMedium element: %d\n ",A[(n)/2]);
print(A);
}
//always putting first to pivot
void quick(int *A,int left,int right,int k){//k is for another method,not used here
int pivot,i,j;
if(k==1){
indexPivot=left;
pivot=A[indexPivot];
}
/*else{
if(A[left]<A[right]){
if(A[(right+left)/2]>A[right]){
indexPivot=right;
}
else{
indexPivot=(right+left)/2;
}
}
else{
if(A[(right+left)/2]>A[left]){
indexPivot=left;
}
else{
indexPivot=(right+left)/2;
}
}
}
printf("\n Pivot: %d",A[indexPivot]);*/
while(indexPivot!=(right+left)/2&&left<right){
j=right;
i=left+1;print(A);
while(i<j){
while(pivot<A[j]&&left<j){
j=j-1;
print(A);
}
while(pivot>A[i]&&i<j){
i=i+1;
print(A);
}
if(i<j){
swap(A,i,j);
print(A);
i=i+1;
j=j-1;
print(A);
}
print(A);
}
//while(A[s]>pivot){i=i-1;}
swap(A,indexPivot,j);
indexPivot=j;//pivot goes its place
print(A);
if(indexPivot>(right+left)/2){
quick(A,left,indexPivot-1,k);
print(A);
}
if(indexPivot<(right+left)/2){
quick(A,indexPivot+1,right,k);
print(A);
}
}
}
void print(int *A){
int i;
printf("\n ");
for(i=0;i<n;i++){
printf("%d ",A[i]);
}
}
void swap(int *A,int x,int y){
int tmp;
tmp=A[x];
A[x]=A[y];
A[y]=tmp;
}
我正在为此工作5个小时,但仍然无法做到。它进入了不定式循环。
我给{1,2,3,4,5
,但它会进入无限循环。
我调试,分析但看不到它。
等待别人的建议。
这不是所有的快速排序。我正在尝试不同的东西。唯一的区别是
if(indexPivot>(right+left)/2){
quick(A,left,indexPivot-1,k);
print(A);
}
if(indexPivot<(right+left)/2){
quick(A,indexPivot+1,right,k);
print(A);
}
那部分。
答案 0 :(得分:0)
问题似乎存在于这一行:
while(pivot<A[j]&&left<j)
应该是:
while(pivot<A[j]&&i<j)