有一组数组25、50、70、21、4、18、100、43、7、12用快速排序,求快速排序的做题方法技巧,和原理。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有一组数组25、50、70、21、4、18、100、43、7、12用快速排序,求快速排序的做题方法技巧,和原理。相关的知识,希望对你有一定的参考价值。
12、7、18、21、4、25、100、43、70、50你好,首先很愿意帮助你。我回答过同一类型的题。我把我回答的记录复制给你,如果还是没有帮助的话,我再详细的做一下你给的题目。先提示一句:一般来说快速排序,哨兵是第一个元素,放在0地址里。原始位置空下。 还有 快速排序也是两种有序的,我的例子是非递减。
eg:
对集合(19,14,23,01,68,84,27)以19为枢轴元素,画出一趟快速排序的过程。求数据结构的答案...
我的回答:
[19] ___ 14 23 01 68 84 27 哨兵同27对比
[19] ___ 14 23 01 68 84 27 同84比
[19] ___ 14 23 01 68 84 27 同68比
[19] 01 14 23 __ 68 84 27 同01比 前置
[19] 01 14 23 — 68 84 27 同14比
[19] 01 14 — 23 68 84 27 同23比较 后置
(01 14 ) 19 ( 23 68 84 27 ) 哨兵恢复 第一趟快速排序完成
希望对你有帮助。 参考技术A 先看懂他的代码,实在不行,建议去看b站或者mooc上看陈越姥姥的数据结构,有演示。
快速排序,一般默认第一个是主元,先和最后一个比较。(如果主元和他 对面的数 (反向)比较,不能保持小->大的顺序就换位),直到全部比较完,就完成一趟排序。
第二趟以后的都是递归快排,以第一趟的主元作为两个部分的分割,两边同时递归快排(同第一趟)。 参考技术B 25、50、70、21、4、18、100、43、7、12
先选第一个,把小于他的放在左边,大于他的放在右边:
21、4、18、7、12、25、50、70、100、43
去掉空的数组,找到长度大于1的数组,重复同样的动作
21、4、18、7、12、25、50、70、100、43
4、18、7、12、21、、25、50、70、100、43
、4、18、7、12、21、25、50、70、100、43
4、7、12、18、、21、25、50、70、100、43
4、、7、12、18、、21、25、50、70、100、43
4、7、12、18、21、25、43、50、70、100
4、7、12、18、21、25、43、50、、70、100
4、7、12、18、21、25、43、50、70、100
最后整合
4、7、12、18、21、25、43、50、70、100 参考技术C 同学,这种东西还是去看课本吧,这样才能学到精髓。其实很简单,把第一个数作为枢轴变量,第一次排序后,枢轴变量左边的都小于它,右边的都大于这个枢轴变量;然后把枢轴变量的左边和右边的序列分别运用上面的方法。祝你好运。详细原理课本吧! 参考技术D {12、7、18、21、4、25、100、43、70、50}。
以特定方式组合一组数组
【中文标题】以特定方式组合一组数组【英文标题】:Combine a set of a arrays in a specific way 【发布时间】:2020-01-13 13:57:29 【问题描述】:我有一组 9 个不同的数组,大小均为 n 乘以 n。我需要以元素方式组合它们以产生特定的数组。
例如:给定一组 9 个大小相等的数组:
a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])
a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])
a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])
想要的结果是
b = np.array([[11, 21, 31, 12, 22, 32, 13, 23, 33],
[41, 51, 61, 42, 52, 62, 43, 53, 63],
[71, 81, 91, 72, 82, 92, 73, 83, 94],
[14, 24, 34, 15, 25, 35, 16, 26, 36],
[44, 54, 64, 45, 55, 65, 46, 56, 66],
[74, 84, 94, 75, 85, 95, 76, 86, 96],
[17, 27, 37, 18, 28, 38, 19, 29, 39],
[47, 57, 67, 48, 58, 68, 49, 59, 69],
[77, 87, 97, 78, 88, 98, 79, 89, 99]])
所以数组 b 的第一行由 a1、a2 和 a3 的第一行组成,按元素组合。
数组 b 的第二行由 a4、a5 和 a6 的第一行组成,按元素组合。
第三行由 a7、a8 和 a9 的第一行组成,按元素组合。
然后在 a1-a9 中的其余行继续使用相同的模式。
这需要适用于任何大小的 a1-a9 数组,因为数组的大小为 n 乘以 n。我尝试过修改 np.concatenate、zip 和 np.einsum,但都没有成功。
【问题讨论】:
欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。不鼓励询问代码的问题。 【参考方案1】:编辑:推广到不同的数组大小和数组数量:
import numpy as np
def combine_arrays(arrays):
arrays = np.asarray(arrays)
n, p, q = arrays.shape
s = int(round(np.sqrt(n)))
arrays = arrays.reshape(s, -1, p, q)
return arrays.transpose(2, 0, 3, 1).reshape(s * p, -1)
a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])
a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])
a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])
print(combine_arrays([a1, a2, a3, a4, a5, a6, a7, a8, a9]))
# [[11 21 31 12 22 32 13 23 33]
# [41 51 61 42 52 62 43 53 63]
# [71 81 91 72 82 92 73 83 93]
# [14 24 34 15 25 35 16 26 36]
# [44 54 64 45 55 65 46 56 66]
# [74 84 94 75 85 95 76 86 96]
# [17 27 37 18 28 38 19 29 39]
# [47 57 67 48 58 68 49 59 69]
# [77 87 97 78 88 98 79 89 99]]
a1 = np.array([[11, 12], [14, 15]])
a2 = np.array([[21, 22], [24, 25]])
a3 = np.array([[31, 32], [34, 35]])
a4 = np.array([[41, 42], [44, 45]])
print(combine_arrays([a1, a2, a3, a4]))
# [[11 21 12 22]
# [31 41 32 42]
# [14 24 15 25]
# [34 44 35 45]]
您可以通过重塑和转置来做到这一点:
import numpy as np
a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])
a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])
a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])
a = np.stack([a1, a2, a3, a4, a5, a6, a7, a8, a9])
a = a.reshape(3, 3, 3, 3).transpose(2, 0, 3, 1).reshape(9, 9)
print(a)
# [[11 21 31 12 22 32 13 23 33]
# [41 51 61 42 52 62 43 53 63]
# [71 81 91 72 82 92 73 83 93]
# [14 24 34 15 25 35 16 26 36]
# [44 54 64 45 55 65 46 56 66]
# [74 84 94 75 85 95 76 86 96]
# [17 27 37 18 28 38 19 29 39]
# [47 57 67 48 58 68 49 59 69]
# [77 87 97 78 88 98 79 89 99]]
【讨论】:
从np.array([..])
开始的性能似乎比np.stack
好一些。
对不起,但这个答案并不是问题中所问的“对于任何大小的 a1-a9 数组”的概括......您的尺寸应该在重塑之前计算,而不是强加。
@jeannej 谢谢,没看那部分,现在添加通用解决方案。【参考方案2】:
试试这个:
>>> import numpy as np
>>> np.hstack([
np.vstack([a1.ravel(), a2.ravel(), a3.ravel()]).T.reshape(3, -1),
np.vstack([a4.ravel(), a5.ravel(), a6.ravel()]).T.reshape(3, -1),
np.vstack([a7.ravel(), a8.ravel(), a9.ravel()]).T.reshape(3, -1)
]).reshape(9,9)
array([[11, 21, 31, 12, 22, 32, 13, 23, 33],
[41, 51, 61, 42, 52, 62, 43, 53, 63],
[71, 81, 91, 72, 82, 92, 73, 83, 93],
[14, 24, 34, 15, 25, 35, 16, 26, 36],
[44, 54, 64, 45, 55, 65, 46, 56, 66],
[74, 84, 94, 75, 85, 95, 76, 86, 96],
[17, 27, 37, 18, 28, 38, 19, 29, 39],
[47, 57, 67, 48, 58, 68, 49, 59, 69],
[77, 87, 97, 78, 88, 98, 79, 89, 99]])
【讨论】:
对不起,但这个答案并不是问题中所问的“对于任何大小的 a1-a9 数组”的概括......您的尺寸应该在重塑之前计算,而不是强加。 为什么在flatten
方法之上使用ravel
方法?
因为它更快,更适合这个问题;)***.com/a/28930580/11610186
感谢您的链接,虽然我不明白为什么这个“更适合这个问题”:你不知道之后是否使用ai
,在这种情况下,如果它们被覆盖了......虽然ravel
确实更快(ravel
和flatten
和timeit.repeat
我得到了 1.2e-3 秒和 3.9e-3 秒),但这看起来并不安全在不知道其余代码的情况下。也许只是在您的答案中添加一条注释,说明ai
可以通过该过程进行修改,如果需要,您应该改用flatten
方法?
不,它不会 - 如果您要修改 ravel
-ed 数组,那么也许。但在这种情况下,你不会例如pastebin.com/0h5Wvgv9 这就是“更适合这个问题”的原因。特别是如果您将结果分配给另一个变量。【参考方案3】:
至于时间速度(在 10000 次迭代中使用 timeit.repeat
来获得),从最好到最差:
-
@jdehesa
np.stack
+ a.reshape(3, 3, 3, 3).transpose(2, 0, 3, 1).reshape(9, 9)
: 9.9e-2 秒
@Grzegorz Skibinski vstack
+ hstack
+ reshape
: 1.6e-1 秒
【讨论】:
这似乎没有给我正确的答案(数组以[[11 12 13 21 22 ...
开头)。
@jdehesa oooops 你是对的,我的错我在这里太快了,我会编辑我的帖子(虽然现在你编辑了你的答案,我最喜欢它;))以上是关于有一组数组25、50、70、21、4、18、100、43、7、12用快速排序,求快速排序的做题方法技巧,和原理。的主要内容,如果未能解决你的问题,请参考以下文章