选择排序算法的实现不起作用

时间:2015-12-27 07:13:40

标签: ios swift algorithm

我正在尝试使用Swift提高我对排序算法的了解。

交换功能本身可以正常工作,但是当我想在selectionSort函数中使用它时,它没有按照我的预期去做。 myArray未排序。

这是我的代码:

func swap(var myArray:[Int], firstIndex: Int, secondIndex: Int) -> [Int] {
  let temp =  myArray[firstIndex]
  myArray[firstIndex] = myArray[secondIndex]
  myArray[secondIndex] = temp

  return myArray
}


func indexOfMinimum( myArray:[Int], startIndex: Int ) -> Int {
  // Set initial values for minValue and minIndex,
  // based on the leftmost entry in the subarray:

  var minValue = myArray[startIndex]
  var minIndex = startIndex

  // Loop over items starting with startIndex,
  // updating minValue and minIndex as needed:

 for(var i = minIndex + 1; i < myArray.count; i++){
    if( myArray[i] < minValue   ) {
      minIndex = i
      minValue =  myArray[i]
    }
  }
  return minIndex
}

// This function is not working properly

func selectionSort(myArray: [Int]) {
  var x: Int
  for ( var i = 0; i < myArray.count; i++) {
    x = indexOfMinimum( myArray,startIndex: i)
    swap(myArray, firstIndex: i, secondIndex: x)
  }
}

var myArray2 = [22, 11, 99, 88, 9, 7, 42]
selectionSort(myArray2)

myArray2 // that is the result that I'm getting [22, 11, 99, 88, 9, 7, 42] 

//while I should get [7, 9, 11, 22, 42, 88, 99]

3 个答案:

答案 0 :(得分:2)

您无法修改原始Array。阅读有关值和引用类型here的更多信息。如果要对数组ASC进行排序,可以使用myArray2.sort({ $0 < $1 })

所以,只需要做到你想要的结果。

myArray2 = myArray2.sort({ $0 < $1 })
print(myArray2)

结果将是

[7, 9, 11, 22, 42, 88, 99]

Sort是Swift内置的功能。

<强>更新

您尝试做的事情称为Bubble sort。你缺少的一件事是两个数字之间的比较。另一件事是价值类型。如果你想确切地找出你缺少的代码,那么你需要调试行的行,这是理解代码如何工作以及为什么它不按你想要的方式运行的好方法。

否则,这是一个有效的冒泡排序功能,我建议你学习它是如何工作的,并改为使用它。

func bubbleSort(inout numbers: [Int]) -> () {
    let numbersLength = numbers.count

    for var i = 0; i < numbersLength; i++ {
        for var j = 1; j < numbersLength-i; j++ {
            if numbers[j-1] > numbers[j] {
                let swap = numbers[j-1]
                numbers[j-1] = numbers[j]
                numbers[j] = swap
            }
        }
    }
}

func start(){
    // Numbers to sort
    var myArray = [22, 11, 99, 88, 9, 7, 42]

    // Print initial
    print("Initial:")
    for num in myArray {
        print("\(num) ")
    }

    // Execute Bubble Sort
    bubbleSort(&myArray)

    // Print result
    print("\nResult:")
    for num in myArray {
        print("\(num) ")
    }

    print(myArray)
}

答案 1 :(得分:2)

您的功能正在参数。您修改了函数中的参数,但最后没有将其返回,因此您的函数基本上已经死了。

我对编译器优化知之甚少,但如果我是编译器,我会删除selectionSort(myArray2)调用,因为它确实没有。您的swap函数会返回一个值,但是当您在selectionSort中调用它时,您不会使用返回值。 Xcode会给你一个错误。

在函数结束时,没有修改任何内容,因为修改的所有变量都在函数中分配,并在结束时超出范围。

您可能在selectionSort尝试做的是:

myArray = swap(...);

你可能在主要部分尝试做的是

myArray = selectionSort(...);

答案 2 :(得分:1)

您可能会因为无法在功能中更改复制的值类型而被绊倒。

作为Arc676 suggests in his answer,你可以考虑使用你返回的修改后的数组,但是你应该记住,改变你也在迭代的数组可能会有问题。

由于您的问题纯粹是为了理解算法,因此您应该考虑the approach that Martin mentions,并使用inout来更改您传递给selectionSort和swap函数的Array值类型。

func swap(inout myArray:[Int], firstIndex: Int, secondIndex: Int) {
    let temp =  myArray[firstIndex]
    myArray[firstIndex] = myArray[secondIndex]
    myArray[secondIndex] = temp
}

func indexOfMinimum( myArray:[Int], startIndex: Int ) -> Int {
    // Set initial values for minValue and minIndex,
    // based on the leftmost entry in the subarray:

    var minValue = myArray[startIndex]
    var minIndex = startIndex

    // Loop over items starting with startIndex,
    // updating minValue and minIndex as needed:

    for(var i = minIndex + 1; i < myArray.count; i++){
        if( myArray[i] < minValue   ) {
            minIndex = i
            minValue =  myArray[i]
        }
    }
    return minIndex
}

func selectionSort(inout myArray: [Int]) {
    var x: Int
    for ( var i = 0; i < myArray.count; i++) {
        x = indexOfMinimum( myArray,startIndex: i)
        swap(&myArray, firstIndex: i, secondIndex: x)
    }
}

var myArray2 = [22, 11, 99, 88, 9, 7, 42]
selectionSort(&myArray2)

myArray2 //  Now you get[7, 9, 11, 22, 42, 88, 99]