当前位置: 首页 > 知识库问答 >
问题:

快速排序递归Java

姬银龙
2023-03-14

我正在尝试使用递归编写快速排序代码,但我得到一个堆栈溢出错误。第二个递归函数给出了连续误差。我只是想不通。

public class QuickSortRec {
public static void quicksort(int input[],int a,int b)
{
    if(a<b)
    {
        int pivotpos=partition(input,a,b);
        quicksort(input, a,pivotpos-1);
        quicksort(input, pivotpos+1,b);
    }
}
private static int partition(int input[],int a,int b)
{
    int pivot=input[a];
    int count=0;
    for(int i=a+1;i< input.length;i++)
    {
        if(input[i]<pivot)
        {
            count++;
        }
    }
    int temp=input[a];
    input[a]=input[count];
    input[count]=temp;
    for(int i=0;i<count;i++)
    {
        if(input[i]>pivot)
        {
            for(int j=input.length-1;j>pivot;j--)
            {
                if(input[j]<pivot)
                {
                    temp=input[i];
                    input[i]=input[j];
                    input[j]=temp;
                }
            }
        }
    }
    return count;
}
public static void main(String[]args)
{
    int arr[]={6,2,10,8,15,3,4};
    int a=0;
    int b=arr.length-1;
    quicksort(arr,a,b);
    for(int i=0;i<arr.length;i++)
    {
        System.out.print(arr[i]+" ");
    }
  }
}

共有1个答案

贺宝
2023-03-14

你有些错误。例如,您从未在pivot函数中使用b。您必须更改partition函数,如下所示:

public class QuickSortRec {
    public static void quicksort(int input[],int a,int b)
    {
        if(a<b)
        {
            int pivotpos=partition(input, a,b);
            quicksort(input, a,pivotpos-1);
            quicksort(input, pivotpos+1,b);
        }
    }

    private static int partition(int arr[],int low,int high)
    {
        int pivot = arr[high];
        int i = (low-1); // index of smaller element
        for (int j=low; j<high; j++)
        {
            // If current element is smaller than or
            // equal to pivot
            if (arr[j] <= pivot)
            {
                i++;

                // swap arr[i] and arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        // swap arr[i+1] and arr[high] (or pivot)
        int temp = arr[i+1];
        arr[i+1] = arr[high];
        arr[high] = temp;

        return i+1;
    }

    public static void main(String[]args)
    {
        int arr[]={6,2,10,8,15,3,4};
        int a=0;
        int b=arr.length-1;
        quicksort(arr,a,b);
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]+" ");
        }
    }
}

 类似资料:
  • 本文向大家介绍C#递归算法之快速排序,包括了C#递归算法之快速排序的使用技巧和注意事项,需要的朋友参考一下 上两片第归算法学习: 1)递归算法之分而治之策略 2)递归算法之归并排序   上一篇学习中介绍了了递归算法在排序中的一个应用:归并排序,在排序算法中还有一种算法用到了递归,那就是快速排序,快速排序也是一种利用了分而治之策略的算法,它由C.A.R发明,它依据中心元素的值,利用一系列递归调用将数

  • 快速排序 from typing import List def quick_sort(arr: List, left, right) -> List: """ 快速排序是对冒泡排序的改进,核心思想是找到一个中值点pivot,然后将小于等于pivot的放在pivot的左边,大于pivot的放在右边,一直递归到无法拆分pivot点。 :param arr: :re

  • 在很多地方,我都看到过使用堆栈实现快速排序比使用递归更快的说法。这是真的吗?我知道编译器通常擅长将递归转换为迭代,但页面上的评论称,递归太复杂,无法优化。 快速排序还有哪些其他优化? 以下是我提到的一些地方,即递归实现优于递归实现:http://www.geeksforgeeks.org/iterative-quick-sort/ 尽管有上述优化,该函数仍然是递归的,并使用函数调用堆栈来存储l和h

  • 本文向大家介绍JavaScript希尔排序、快速排序、归并排序算法,包括了JavaScript希尔排序、快速排序、归并排序算法的使用技巧和注意事项,需要的朋友参考一下 以var a = [4,2,6,3,1,9,5,7,8,0];为例子。 1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。 过程输出: 由输出可以看到。第一轮间隔为5。依次对这些间隔的数组插入排序

  • 我想比较有多少掉期和比较( 我的泡泡裙: 我的快速排序: 解决方案:

  • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两