在数组上应用void函数

时间:2019-03-22 08:00:33

标签: swift quicksort

我现在正在学习Swift,想为[Int]写一个快速排序算法

func swap(array:[Int], x:Int, y:Int)->[Int] {  //swap elements in array
    var result:[Int] = array
    result[y] = array[x]
    result[x] = array[y]
    return result
}

func split(array:[Int], u:Int, o:Int , p:Int)->Int {  //where the sorting happens
    let pivot:Int = array[p]
    swap(array: array, x: p, y: o)
    var pn:Int = u

    for j in u...o {
        if(array[j] <= pivot) {
        swap(array: array, x: pn, y: j)
        pn = pn+1
        }
    }
    swap(array: array, x: pn, y: o);
    return pn;
}

func quickSortR(array:[Int],u:Int ,o:Int) {  //recursive call
    if(u < o){
        let p:Int = o
        let pn:Int = split(array: array, u: u, o: o, p: p)
        quickSortR(array: array,u: u,o: pn-1)
        quickSortR(array: array,u: pn+1,o: o)
    }
}

func quickSort(array:[Int]) {  //initial call
    quickSortR(array: array, u: 0, o: array.count-1)
}

我的问题是,我不知道如何在数组上应用此实现。

例如,如果我得到了数组a:[Int] = [3,1,2]。 由于print(quickSort(a))的返回类型为quickSort,因此我无法检查实现是否在void上运行。 当然,我不能在quickSort

这样的数组上应用a.quickSort(a)

如果不是引起这种问题的原因(例如,仅是签名或返回类型),我真的不想做太多改变。

1 个答案:

答案 0 :(得分:2)

只需改善您的语法即可:

func swap(array: inout [Int], x:Int, y:Int) {  //swap elements in array
    let temp = array[x]
    array[x] = array[y]
    array[y] = temp
}

func split(array: inout [Int], u:Int, o:Int , p:Int) -> Int {  //where the sorting happens
    print(ar, u , o , p)
    let pivot:Int = array[p]
    swap(array: &array, x: p, y: o)
    var pn:Int = u

    for j in u..<o {
        if(array[j] <= pivot) {
            swap(array: &array, x: pn, y: j)
            pn = pn+1
        }
    }
    swap(array: &array, x: pn, y: o);
    return pn;
}

func quickSortR(array: inout [Int],u:Int ,o:Int) {  //recursive call

    if(u < o){
        let p:Int = o
        let pn:Int = split(array: &array, u: u, o: o, p: p)

        quickSortR(array: &array,u: u,o: pn-1)
        quickSortR(array: &array,u: pn+1,o: o)
    }
}

func quickSort(array: inout [Int]) {  //initial call
    quickSortR(array: &array, u: 0, o: array.count-1)
}

如果使用func swap(array: [Int])array在方法内部是不可变的。它只是复制。使用inout可解决此问题。

要使用以下方式检查代码:

var ar = [1]
quickSort(array: &ar)
print(ar)