2015-12-27 24 views
1

我想提高我使用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] 
+2

您能更具体地了解什么“不起作用”? – Arc676

+0

称为'selectionSort'的第三个函数不起作用。它对阵列没有任何作用。我试图让它返回一个整数数组的返回函数,但它不起作用 – AziCode

+3

Swift数组是*值类型*,这意味着您的原始数组永远不会被修改。阅读有关inout参数... –

回答

2

您不容修改原来的Array。详细了解价值和参考类型here。如果你想排序一个数组ASC,你可以使用myArray2.sort({ $0 < $1 })

所以要得到你想要的结果就行了。

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

而其结果将是

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

排序是一个内置的功能斯威夫特。

更新

什么you're试图做的是叫Bubble sort。你缺乏的是两个数字之间的比较。另一件事是价值类型。如果你想知道你的代码是否缺少,那么你需要调试行的行,这是了解你的代码是如何工作的,以及为什么它不像你想要的那样行事。

否则,这里是一个工作的Bubble排序功能,我可以推荐你学习它是如何工作的,并用它来代替。

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) 
} 
+0

谢谢,但我想从头开始实施它,以加深我对该语言的了解。 – AziCode

+1

查看更新,了解更多信息@AziCode –

2

您的函数正在接受一个参数。您可以在函数中修改参数,并且不会在最后返回它,因此您的函数基本上已经死亡。

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

在函数的末尾,什么也没有被修改,因为所有被修改的变量都在函数中分配,并在结束时超出范围。

什么你可能想在selectionSort做的是:

myArray = swap(...); 

什么你可能试图在主要部分做的是

myArray = selectionSort(...); 
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]