m0_74423385 2024-04-10 16:33 采纳率: 50%
浏览 2

用分治法实现快速排序算法出现的问题

用分治法实现快速排序算法出现的问题

1.以数组中第一个数作为基准值
正确代码

```c
#include <stdio.h>
void Swap(int *a,int *b)
{
    int t=*a;
    *a=*b;
    *b=t; 
 } 

void QuickSort(int a[],int s,int e)
{
    int l=s;
    int r=e;
    int k=l; 
    //if(s>e) return ;
    if(s<e){
     
        while(l<r){
//            while(a[r]>=a[k]) r--;
//            while(a[l]<=a[k]) l++;    
            while(l<r&&a[r]>=a[k]) r--;           
            while(l<r&&a[l]<=a[k]) l++;    
           
                Swap(&a[l],&a[r]);
                            
                        
        }
        Swap(&a[k], &a[r]);            
        QuickSort(a,s,r-1);
        QuickSort(a,r+1,e);
    }
}

int main(){
    int n,a[100000],k;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    } 

    int s=0;
    QuickSort(a,s,n-1);
    
    for(int i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    } 
} 
我的问题:如果将


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/faba9e06f5a24528a99307ee55d739be.png "#left")
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-10 16:33
    关注

    引自免费微信小程序:皆我百晓生

    好的,我很乐意帮你解答这个问题。

    首先,让我们来看一下正确的快速排序算法实现代码:

    #include <stdio.h>
    
    void swap(int *a, int *b)
    {
        int t=*a;
        *a=*b;
        *b=t; 
     }
    
    void quickSort(int a[], int s, int e)
    {
        int left = s;
        int right = e;
        int pivot = a[s];
        int k = s;
    
        // if (s > e) return;
    
        while (left <= right)
        {
            while (a[right] >= pivot)
                right--;
    
            while (a[left] <= pivot)
                left++;
    
            if (right - left <= 1)
                break;
    
            swap(&a[left], &a[right]);
    
            k++;
        }
    
        // partition
        if (k == s + 1 || k == e)
        {
            k++;
        }
    
        // recursive call on left and right subarrays
        if (k < s)
            quickSort(a, s, k);
    
        if (k < e)
            quickSort(a, k + 1, e);
    }
    
    int main()
    {
        int n, a[100000], k;
        scanf("%d", &n);
    
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
    
        int s = 0;
        quickSort(a, s, n - 1);
    
        for (int i = 0; i < n; i++)
        {
            printf("%d ", a[i]);
        } 
    }
    

    在这个版本的代码中,我们首先定义了一个交换函数,然后在主函数中调用了这个函数,用于交换数组中的两个元素。接着,我们在主函数中创建了一个基准元素,并初始化了左右指针。接下来,我们使用一个while循环遍历数组,每次都将比基准元素小的元素向右移动一位,直到找到与基准元素相等的元素。然后,我们将基准元素与当前未处理的元素进行交换,并将基准元素向前移动一位。然后,我们递归地对左半部分和右半部分的子数组进行快速排序。最后,在主函数中,我们再次调用了quickSort函数,对整个数组进行排序。

    至于你提到的第二个问题,由于快速排序是一种分治策略,其核心思想是通过不断划分问题来解决。所以,即使没有特别的限制,快速排序仍然可以成功实现。因此,如果你继续使用原始代码,你应该不会遇到任何问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月10日

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图