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

如何改进已经是O(n)的递归排序算法?

缪晋
2023-03-14

我有一个用于作业的递归排序算法,我的老师说有一个简单的方法可以提高我的算法的运行时间...但是我根本不知道它是什么。除非我错了,否则算法的复杂度是O(n)?我不确定,因为我们没有在课堂上学习如何计算递归方法的复杂度。代码如下:

public static void MyAlgorithm(int[] A, int n){
    boolean done = true;
    int j = 0;
    while (j <= n - 2){
        if (A[j] > A[j + 1]) {
            swap(A,j,j+1);
            done= false;
        }
        j++;
    }
    j = n - 1;
    while (j >= 1){
        if (A[j] < A[j - 1]) {
            swap(A,j-1,j);
            done=false;
        }
        j--; 
    }

    if (!done)
        MyAlgorithm(A, n);
    else
        return;
}

我唯一能想到的是添加if(done)返回;在第一个循环之后,但它只会使程序免于执行其他一些操作。哦,交换方法基本上就是:

public static void swap(int[] arr, int pos1, int pos2){
    int temp = arr[pos1];
    arr[pos1] = arr[pos2];
    arr[pos2] = temp;
}

提前谢谢你。

共有1个答案

商宏爽
2023-03-14

首先,不能使用比较在O(n)中执行排序算法。作为一般规则,所有排序算法至少需要O(n*log(n))时间。

您使用的排序类似于鸡尾酒摇壶排序或双向气泡排序。它在O(n^2)时间内运行。你一定要研究你使用的方法,考虑为什么要使用它们,还要学习如何用大O符号正确地分类事物。

我想你的老师的意思是你应该把排序称为MyAlgorithm(a,n-1)。注意,在第一个循环中,它是如何穿过整个阵列的?这意味着当该循环退出时,最后一个元素已经被排序。类似地,您可以添加一个开始索引并每次递增。例如,修订代码:

public static void MyAlgorithm(int[] A, int start, int n){
    boolean done = true;
    int j = start;
    while (j <= n - 2){
        if (A[j] > A[j + 1]) {
            swap(A,j,j+1);
            done= false;
        }
        j++;
    }
    j = n - 1;
    while (j >= start+1){
        if (A[j] < A[j - 1]) {
            swap(A,j-1,j);
            done=false;
        }
        j--; 
    }

    if (!done)
        MyAlgorithm(A, start+1, n-1);
    else
        return;
}

然后您可以使用:MyAlgorithm(my\u array,0,my\u array.length)调用它

请记住,这仍然不是一个很棒的排序算法,如果您需要对大量数据进行排序,您应该考虑使用更快的算法。

 类似资料:
  • 本文向大家介绍C#递归算法之归并排序,包括了C#递归算法之归并排序的使用技巧和注意事项,需要的朋友参考一下 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,

  • LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?

  • 我有个小问题。我尝试实现合并排序算法递归。 现在我的问题: 左=合并排序(rrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));右=合并排序(rrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length)); 如果我尝试分配我的左/右数组“mergeSort(..

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

  • 如果使用双向链表代替数组,是否有可能提高插入排序算法的运行时间? 非常感谢。

  • 我写了3个方法来实现递归合并排序,参数数量有限(没有aux、lo、mid、hi)。我认为我的工作是这样的,但它并没有返回一个排序数组,尽管它在运行时没有任何编译错误。我已经摆弄了4个小时,似乎无法弄清楚我做错了什么,没有合并一个有序数组。我只从我的助教那里得到了非常模糊的输入,并且能够修复我正在遇到的一些问题,但是该方法仍然没有对项数组进行排序。欢迎任何关于我在这里做错了什么的建议。谢谢!