问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-05-05 08:48

我来回答

3个回答

热心网友 时间:2023-11-09 04:25

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

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

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

#include<stdio.h>
#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<high)
{
while(low<high&&L->r[high]>=pivotkey)
    high--;
swap(L,low,high);
while(low<high&&L->r[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<i;j++)
    {
    scanf("%d",&L.r[j]);
   }
    QuickSort(&L,low,high);
    for(j=0;j<i;j++)
    {
    printf("%d   ",L.r[j]);
    }

}

追问不好意思,再问一个问题
我在main里面只定义了一个SqList L,为什么int Partition(SqList *L,int low,int high)能出现SqList *L呢??L又不是指针,加不加*为什么有区别呢

追答在main里面,我改过之后,是通过QuickSort(&L,low,high)调用,&L就是求地址,即指针。
Partition和QuickSort都是使用指针传参,按址传递。

热心网友 时间:2023-11-09 04:25

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

热心网友 时间:2023-11-09 04:26

#include<stdio.h>
#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<high){
pivotkey=L->r[low];
while(low<high){
while(low<high&&L->r[high]>=pivotkey)
high--;
swap(L,low,high);
while(low<high&&L->r[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<i;j++){
scanf("%d",&L.r[j]);
}
Partition(&L,low,high);
for(j=0;j<i;j++){
printf("%d ",L.r[j]);
}
}

热心网友 时间:2023-11-09 04:25

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

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

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

#include<stdio.h>
#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<high)
{
while(low<high&&L->r[high]>=pivotkey)
    high--;
swap(L,low,high);
while(low<high&&L->r[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<i;j++)
    {
    scanf("%d",&L.r[j]);
   }
    QuickSort(&L,low,high);
    for(j=0;j<i;j++)
    {
    printf("%d   ",L.r[j]);
    }

}

追问不好意思,再问一个问题
我在main里面只定义了一个SqList L,为什么int Partition(SqList *L,int low,int high)能出现SqList *L呢??L又不是指针,加不加*为什么有区别呢

追答在main里面,我改过之后,是通过QuickSort(&L,low,high)调用,&L就是求地址,即指针。
Partition和QuickSort都是使用指针传参,按址传递。

热心网友 时间:2023-11-09 04:25

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

热心网友 时间:2023-11-09 04:26

#include<stdio.h>
#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<high){
pivotkey=L->r[low];
while(low<high){
while(low<high&&L->r[high]>=pivotkey)
high--;
swap(L,low,high);
while(low<high&&L->r[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<i;j++){
scanf("%d",&L.r[j]);
}
Partition(&L,low,high);
for(j=0;j<i;j++){
printf("%d ",L.r[j]);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华丽转身为什么在优酷看不了了之 《华丽转身:爱情不在服务区》txt全集下载 翡翠台华丽转身英文曲 matplotlib中plt.imshow函数画图出现的颜色问题 数字图像处理(c++ opencv):形态学图像处理-提取连通域 ...opencv做东西,网上的程序读着还可以,程序遇到问题不会改,一些函_百... 深度学习面试问题总结 | 传统图像处理——OpenCV 活虾如何在晚上保持存活状态进行保存? neu代表什么意思 民办学校和私立学校的区别是什么民办学校和私立学校的区别 快速排序怎样才算一趟 如何通过一趟快速排序得到以下数组的前40个元素? 中国电信套餐每月扣20元花呗怎么回事 北面白标值得买吗 守护通常指爱情吗? 守望爱情是什么意思 爱情守护大哥是什么意思 众人分期人工客服电话. 中融基金客服电话是什么 鬼谷八荒风灵月影宗什么意思风灵月影宗加入方法 欧莱雅450粉底液太黑了怎么办 什么是防静电地板防静电地板分类 防静电活动地板详解分类、优点、选购全都有 蠡湖紫砂壶是真紫砂吗 直线的夹角公式怎么求? 春节在二十四节气中吗? 杭州四季青面料市场都是哪里进的货 福建冶金工业设计院怎么样 什么是无公害蔬菜、绿色食品和有机食品 什么是无污染蔬菜? 常见的数据结构排序算法中,一趟排序后能确定一个最终位置的有哪些? WPC世界电子竞技职业精英赛的关于ACE 兔子是比较爱吃白菜还是比较爱吃萝卜? 爱吃白菜的小兔子 兔子可以只吃白菜吗 对自己以前照片的感慨句子 对旧物的留念的说说 家里来了只兔子吃了白菜又走了好不好 “夏奈”用日语怎么说? 南家三姐妹中的夏奈性格是什么 川口夏奈是不是改名了 这是动漫人物吗,如果是,是哪部动漫的呢? 夏奈和藤冈哪一话约会了 音雨夏奈日文写法 小学二年级三好学生申请书范文 小学三好学生申请书8篇 算卦时说少女从长男什么意思 求儿且慢,待后日.六甲先男后女什么意思 先女后男,先男后女? “丑末先克母,女命主防父,先男后有女,晚景贵人助。”这句话什么意思,求详解!谢谢~ 易经中讲 男为阳 女为阴 阳在先阴在后 好字也是左为阴右为阳 那么为什么算卦的时候就要男左女右了呢?