【问题标题】:Recursive function to sort an array [closed]对数组进行排序的递归函数[关闭]
【发布时间】:2015-12-24 14:40:00
【问题描述】:

我在构建对整数数组进行排序的递归函数时遇到问题。在这一点上,我不知道任何排序算法,这只是我的第二门 CS 课程。我在这里看到了很多解决方案,但这些解决方案的问题是它们有循环或嵌套条件语句。在这个函数中,我不能使用循环或嵌套 if 语句,只能使用单个 if/else 语句。

我知道你们不想简单地给出答案,因为这会影响学习体验,但如果我能指出正确的方向,我将不胜感激。

【问题讨论】:

  • 合并排序是一种利用一个元素的数组已排序这一事实的排序。
  • 这类编程称为DP(动态编程)。而快速排序是最快的排序算法(geeksforgeeks.org/iterative-quick-sort)解释了基础知识..
  • [Quicksort ](en.wikipedia.org/wiki/Quicksort) 是递归排序算法的典型示例。
  • 我建议在他们要求您之前不要查看现有算法。从您的基本案例开始。数组的大小预计会达到 1,这意味着之前的调用提供了一个更大大小的数组。因此,最好先自己尝试一下,了解如何以一种涉及查看越来越小的部分的方式对数组进行排序。使用你所学到的关于递归的知识来推断在调用函数之前和之后你可能会做什么。使用物理或绘制的对象来帮助找到可行的解决方案。这将帮助您以后轻松理解许多算法

标签: java arrays recursion


【解决方案1】:

c++程序中的简单答案

#include<bits/stdc++.h>
using namespace std;

void insert(std::vector<int> &v,int num)
{
    if(v.size()==0 || v[v.size()-1]<=num)
    {
        v.push_back(num);
        return ;
    }
    int num2=v.back();
    v.pop_back();
    insert(v,num);
    v.push_back(num2);

}


void  sortv(vector<int> &v)
{
    if(v.size()==1)
    {
        return;
    }

    int num=v.back();
    v.pop_back();
    sortv(v);
    insert(v,num);

}

int main()
{
    std::vector<int> v={1,4,3,5,6,7,1,2,3};
    sortv(v);
    for (auto i : v) {
       cout<<i<<" ";
    }
}

【讨论】:

    【解决方案2】:

    要写一个递归函数-

    1. 写一个函数签名并假设它会用一些魔法完成你的工作。

    2. 现在考虑基本条件,即在最小有效输入的情况下你的函数会做什么。

    3. 现在编写归纳步骤,在较小的输入上调用相同的函数(通常)。

      def sorting(arr):
      
          #Base Condition
          if len(arr) == 1:
              return
      
          #Induction
          last_num = arr[-1]
          arr.pop()
          sorting(arr)
          insert(arr, last_num)
      
          return arr
      
      def insert(arr, last_num):
      
          #Base Condition
          if len(arr) == 0 or arr[-1] <= last_num:
              arr.append(last_num)
              return
      
          #Induction
          val = arr[-1]
          arr.pop()
          insert(arr, last_num)
          arr.append(val)
      

    【讨论】:

    • 只是为了给好奇的人起个名字,这本质上是insertion sort递归完成的。传递索引可能比切断并重新附加列表的尾部更清洁和更快。该程序在使用空列表调用时崩溃。我会使用len(arr) &lt;= 1
    【解决方案3】:

    您可以使用最简单的算法之一,只需添加递归调用。例如。这是接近 InsertinSort 的算法。在每一步中,我们都会查找直到hiswap 的当前元素,以防当前元素大于最高元素。在每个循环的末尾,hi 定位到 arra 的开头,即已排序:

    public final class BubbleSort {
    
        public static void sort(int[] arr) {
            sort(arr, arr.length);
        }
    
        private static void sort(int[] arr, int n) {
            if (n > 1) {
                for (int i = 0; i < n; i++)
                    if (arr[i] > arr[n - 1])
                        swap(arr, i, n - 1);
    
                sort(arr, n - 1);
            }
        }
    
        private static void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    
        private SelectionSort() {
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      我希望您听说过分治算法,在该算法中,我们将给定数组相对于特定元素(称为“枢轴”)进行划分,这样数组的下分区小于枢轴和上分区元素数组高于枢轴。快速排序是递归的最佳示例之一。

      【讨论】:

        【解决方案5】:

        当然还有合并排序和快速排序,它们使用递归并且是最著名的排序算法之一。由于您是初学者,因此如果您从相对简单的开始会更好。这是使用递归的选择排序算法。

        int selection_sort(int num[], int n) //n=array length
        {
            int max = num[0];   
            for (int i = 0; i < n; i++) {
                if (num[i] > max) 
                    max = num[i];
                num[i] = num[n - 1];
                num[n - 1] = max;       
            }
        
            if (n > 0) {
                selection_sort(num, n - 1);
            }
        }
        

        【讨论】:

          【解决方案6】:

          查看Quicksort,这是一种递归算法,可以完全满足您的需求。如果您在实施它时需要帮助,请告诉我。

          【讨论】:

          • 对于初学者来说,我觉得 QuickSort 太难了。 InsertionSort/SelectionSort/BubbleSort 第一次变得容易多了。
          最近更新 更多