C语言中的一趟快速排序问题

2025-06-28 21:50:01
推荐回答(3个)
回答1:

第一,你main里面,把一个没有分配内容的指针L拿来直接用就错了。

第二,quicksort是分而治之,是逐层分。每次partition之后,分成两部分,一边比哨兵小,一边比哨兵大。应该对于这两部分分别继续quicksort。递归的做。你只partition了一次,所以,这一次能不能正好排对就靠运气了。

我给你改了一下,你看看对不对。

#include
#define MAXSIZE 1000

typedef struct
{
int r[MAXSIZE+1];
int length;
}SqList;

void swap(SqList *L,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}

int Partition(SqList *L,int low,int high)
{
int pivotkey;
pivotkey=L->r[low];
while(low {
while(lowr[high]>=pivotkey)
    high--;
swap(L,low,high);
while(lowr[low]<=pivotkey)
    low++;
swap(L,low,high);
    }
return low;
}

void QuickSort(SqList *L, int low, int high){
    int key = Partition(L, low, high);
    if(key > low+1)
        QuickSort(L, low, key-1);
    if(key < high-1)
        QuickSort(L, key+1, high);
}

int main()
{
    SqList L;
    int i,j;
    int low=0,high;
    printf("请输入排序个数:");
    scanf("%d",&i);
    high=i-1;
    printf("请输入元素:"); 
    for(j=0;j    {
     scanf("%d",&L.r[j]);
    }
    QuickSort(&L,low,high);
    for(j=0;j    {
     printf("%d   ",L.r[j]);
    }

}

回答2:

SqList *L;//这里只是一个指针,没有保存元素的内存空间,只要运行都会出错的。

回答3:

#include
#define MAXSIZE 1000
typedef struct{
int r[MAXSIZE+1];
int length;
}SqList;
void swap(SqList *L,int i,int j){
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
void Partition(SqList *L,int low,int high){
int pivotkey;
int l=low,h=high;
if(low pivotkey=L->r[low];
while(low while(lowr[high]>=pivotkey)
high--;
swap(L,low,high);
while(lowr[low]<=pivotkey)
low++;
swap(L,low,high);
}
Partition(L,l,low-1);
Partition(L,low+1,h);
}
}
int main(){
SqList L;
int i,j;
int low=0,high;
printf("请输入排序个数:");
scanf("%d",&i);
high=i-1;
printf("请输入元素:");
for(j=0;j scanf("%d",&L.r[j]);
}
Partition(&L,low,high);
for(j=0;j printf("%d ",L.r[j]);
}
}