2015-07-04 3 views
1

Я очень новичок в Swift, и мне хотелось знать, как я должен модифицировать Int, содержащийся в моем Int[]? Я сделал это так, как будто бы сделал это на Java, но это, очевидно, не работает: я получаю ошибку компиляции Cannot assign to immutable value of type 'Int'.Быстрое изменение массива Int для алгоритма InsertionSort

Вот мой код:

import Foundation 

func createRandomArray(length: Int) -> [Int]{ 
    var random = [Int]() 
    for index in 0...length{ 
     random.append(Int(arc4random_uniform(100))) 
    } 
    return random 
} 

func insertionSort(toSort: [Int]) -> [Int]{ 
    var length = toSort.count 
    for index in 1...length-1{ 
     var key = toSort[index] 
     var previous = index-1 
     while(previous>0 && toSort[previous]>key){ 
      // ERROR IS THERE 
      toSort[previous+1] = toSort[previous] 
      previous-- 
     } 
    } 
    return toSort 
} 

var array = createRandomArray(10) 

print(array) 

print(insertionSort(array)) 

Я думал, что с помощью var вместо let даст изменяемый объект так, поэтому я немного потерял.

Спасибо за помощь

EDIT:

Я получил этот рабочий ответ еще, благодаря @vacawama:

import Foundation 

func createRandomArray(length: Int) -> [Int]{ 
    var random = [Int]() 
    for index in 0...length{ 
     random.append(Int(arc4random_uniform(100))) 
    } 
    return random 
} 

func insertionSort(var toSort: [Int]) -> [Int]{ 
    for firstIterator in 1...toSort.count-1{ 
     var currentValue = toSort[firstIterator] 
     var previousPosition = firstIterator-1 
     while(previousPosition>=0 && toSort[previousPosition]>currentValue){ 
      swap(&toSort[previousPosition+1], &toSort[previousPosition]) 
      previousPosition-- 
     } 
    } 
    return toSort 
} 


var array = createRandomArray(10) 

print(array) 

print(insertionSort(array)) 

ответ

1

По умолчанию параметры массива являются неизменяемыми в вызываемой функции. Если вы хотите изменить копию массива, переданного в insertionSort, добавьте var до toSort в заголовок функции.

func insertionSort(var toSort: [Int]) -> [Int]{ 
+0

Очень круто! Отлично работает! –

0

Я играл со следующим использованием быстрого 3. Надеюсь, это поможет некоторым людям, которые приходят сюда.

import Cocoa 

func ints(cnt: Int, ceiling: Int) -> [Int] { 
    var arr = [Int]() 
    for _ in 0 ..< cnt { 
     arr.append(Int(arc4random_uniform(UInt32(ceiling)))) 
    } 
    return arr 
} 

func insertion(arr: inout [Int]) { 
    for i in 1..<arr.count { 
     var j = i 
     let x = arr[i] 
     while j > 0 && arr[j - 1] > x { 
      arr[j] = arr[j - 1] 
      j -= 1 
     } 
     arr[j] = x 
    } 
} 

let a = ints(cnt: 10, ceiling: 100) 
print(a) 

var b = a 
insertion(arr: &b) 
print(b) 

выход:

[13, 30, 68, 19, 1, 4, 28, 65, 96, 13] 
[1, 4, 13, 13, 19, 28, 30, 65, 68, 96] 

Для сравнения, вот implementaion в Java:

void insertionSort(int[] arr) { 
    for(int i = 1; i < arr.length; i++) { 
     int x = arr[i]; 
     int j = i; 
     while(j > 0 && arr[j - 1] > x) { 
      arr[j] = arr[j - 1]; 
      j--; 
     } 
     arr[j] = x; 
    } 
} 
Смежные вопросы