2015-12-27 25 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]