Arrays 对可变长度项目/算法进行排序

Arrays 对可变长度项目/算法进行排序,arrays,string,algorithm,sorting,Arrays,String,Algorithm,Sorting,我一直在为我的算法期中学习,在我遇到的关于排序可变长度项目的书中有一个问题: 您将获得一个字符串数组,其中不同的字符串可能具有不同的字符数,但所有字符串的字符总数为n。演示如何在O(n)时间内对字符串进行排序 我在网上找到了许多答案,但它们在解释中并不十分清楚,因此如果您能花时间向我更深入地解释这个答案建议如何在O(n)时间内对字符串进行排序,我将不胜感激: 按长度对字符串进行分组并对组进行排序 从最大长度的i开始,向下到1,执行计数 按第i个字符排序。确保只包括具有 第i个字符。 如果这些

我一直在为我的算法期中学习,在我遇到的关于排序可变长度项目的书中有一个问题:

  • 您将获得一个字符串数组,其中不同的字符串可能具有不同的字符数,但所有字符串的字符总数为n。演示如何在O(n)时间内对字符串进行排序
我在网上找到了许多答案,但它们在解释中并不十分清楚,因此如果您能花时间向我更深入地解释这个答案建议如何在O(n)时间内对字符串进行排序,我将不胜感激:

  • 按长度对字符串进行分组并对组进行排序
  • 从最大长度的i开始,向下到1,执行计数 按第i个字符排序。确保只包括具有 第i个字符。 如果这些组是原始阵列中的后续子阵列,则执行

  • 这是您正在搜索的内容:

    简言之:

    开始按字符串的第一个数字排序。 这可以通过一次O(N)完成,因为您不需要将每个元素与其他元素进行比较。您只需要记住数组中每组值的起始和结束位置。例如,所有以“g”开头的字符串都位于数组位置35到500。当您发现一个用“g”表示的字符串时,请将其添加到此组的末尾

    在下一阶段中,您将对这些组中的每个组执行相同的操作

    如您所见,需要O(M*N),其中M是字符串长度,N是字符串数。 在您的例子中,N是所有字符串的总长度,所以它是O(N)


    虽然字符串的长度不同,但仍然可以保留O(N),因为在某些情况下,太短的项不需要重新排序

    可能的重复项(您应该明确这是关于具有可变长度键的项还是关于具有可变长度的项,这可能会使“交换”成为一项挑战。)