Swift 排序中的 For 循环枚举不同
Swift For loop Enumeration in Sort differs
我正在尝试对以下数组进行手动排序。
这里的问题是,从 "for-loop enumuration"(记为 //(2))读取项目与将其作为下标(记为 //(1))读取时,结果会有所不同。这可能是隐藏在我眼睛后面的一个小问题。珍惜你的时间。
var mySortArray : Array<Int> = []
mySortArray = [1,5,3,3,21,11,2]
for (itemX,X) in mySortArray.enumerated() {
for (itemY,Y) in mySortArray.enumerated() {
// if mySortArray[itemX] < mySortArray[itemY] // (1)
if X < Y // (2)
{
//Swap the position of item in the array
mySortArray.swapAt(itemX, itemY)
}
}
}
print(mySortArray)
// Prints [1, 2, 3, 3, 5, 11, 21] ( for condition // (1))
// Prints [2, 1, 3, 5, 11, 3, 21] ( for condition // (2))
mySortArray = [1,5,3,3,21,11,2]
print("Actual Sort Order : \(mySortArray.sorted())")
// Prints Actual Sort Order : [1, 2, 3, 3, 5, 11, 21]
这里的问题是函数 .enumerated()
returns 一个新序列并对其进行迭代。将其视为一个新数组。
所以,您在这里使用了 3 个不同的数组。
您有一个未排序的数组需要修复。让我们称之为 w
("working array") 然后你有数组 x
和数组 y
.
所以,w
就是[1,5,3,3,21,11,2]
,x
和y
实际上和开头的w
是一样的。
现在您得到了需要交换的前两个值...
valueX
位于 x
(5) 的索引 1
处。 valueY
位于 y
(3) 的索引 2
。
然后你交换它们... w
。
所以现在 w
是 [1,3,5,3,21,11,2]
但 x
和 y
没有变化。
所以现在你的索引被抛弃了。您将 x
中的项目与 y
中的项目进行比较,然后在 we
中交换它们,这是完全不同的。
您需要始终使用一个数组。
当然...还有一个问题就是你的功能目前很慢。 O(n^2)
还有更有效的排序方式。
如果您将此作为学习如何编写排序算法的练习,请继续。如果不是,你真的应该使用 .sort()
函数。
您真正想要做的是根本不使用 .enumerated()
。只需使用 ints
获取(和交换)w
.
中的值
即像
for indexX in 0..<w.count {
for indexY in indexX..<w.count {
// do some comparison stuff.
// do some swapping stuff.
}
}
我正在尝试对以下数组进行手动排序。
这里的问题是,从 "for-loop enumuration"(记为 //(2))读取项目与将其作为下标(记为 //(1))读取时,结果会有所不同。这可能是隐藏在我眼睛后面的一个小问题。珍惜你的时间。
var mySortArray : Array<Int> = []
mySortArray = [1,5,3,3,21,11,2]
for (itemX,X) in mySortArray.enumerated() {
for (itemY,Y) in mySortArray.enumerated() {
// if mySortArray[itemX] < mySortArray[itemY] // (1)
if X < Y // (2)
{
//Swap the position of item in the array
mySortArray.swapAt(itemX, itemY)
}
}
}
print(mySortArray)
// Prints [1, 2, 3, 3, 5, 11, 21] ( for condition // (1))
// Prints [2, 1, 3, 5, 11, 3, 21] ( for condition // (2))
mySortArray = [1,5,3,3,21,11,2]
print("Actual Sort Order : \(mySortArray.sorted())")
// Prints Actual Sort Order : [1, 2, 3, 3, 5, 11, 21]
这里的问题是函数 .enumerated()
returns 一个新序列并对其进行迭代。将其视为一个新数组。
所以,您在这里使用了 3 个不同的数组。
您有一个未排序的数组需要修复。让我们称之为 w
("working array") 然后你有数组 x
和数组 y
.
所以,w
就是[1,5,3,3,21,11,2]
,x
和y
实际上和开头的w
是一样的。
现在您得到了需要交换的前两个值...
valueX
位于 x
(5) 的索引 1
处。 valueY
位于 y
(3) 的索引 2
。
然后你交换它们... w
。
所以现在 w
是 [1,3,5,3,21,11,2]
但 x
和 y
没有变化。
所以现在你的索引被抛弃了。您将 x
中的项目与 y
中的项目进行比较,然后在 we
中交换它们,这是完全不同的。
您需要始终使用一个数组。
当然...还有一个问题就是你的功能目前很慢。 O(n^2)
还有更有效的排序方式。
如果您将此作为学习如何编写排序算法的练习,请继续。如果不是,你真的应该使用 .sort()
函数。
您真正想要做的是根本不使用 .enumerated()
。只需使用 ints
获取(和交换)w
.
即像
for indexX in 0..<w.count {
for indexY in indexX..<w.count {
// do some comparison stuff.
// do some swapping stuff.
}
}