出列排序

思考:

我们可以将题目中的一组扑克牌看作是一个右int组成的数组a:[Int]。那么根据题目的限制我们能对这个数组做哪些操作呢:

1、查看最上面的两张牌即a[0]和a[1],我们能够拿到这两个元素的值可以比较大小。

2、交换最上面的两张牌,即将a[0]和a[1]交换。这个很容易,我们可以用一个临时变量完成交换也可以使用swap函数完成交换。

3、可以将最上面的一张牌放到这摞牌的最下面。即是将a[0]插入到数组a的最后其余的元素全部向前移动一个位置。

前两个操作很简单第三个需要我们先实现以下,继续swift:

func moveToLast( a: inout [Int],i:Int) -> Void {
    let tmp = a[i]
    for j in i..<a.count-1 {
        a[j] = a[j+1]
    }
    a[a.count-1] = tmp
}
var a = [9,8,7,6,5,4,3,2,1,0]

第一步:比较a[0]与a[1]的大小,将较小的元素交换到a[0]的位置,第二部:将a[0]位置的元素移动到数组的最后。重复第一与第二部,当执行过a.count-1次之后a[0]位置应该是数组中最大的元素。

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

第三步:将a[0]即最大的元素移动到数组的最后。

[8, 7, 6, 5, 4, 3, 2, 1, 0, 9]

继续重复重复第一步与第二步的操作,当执行过a.count-2时。这时数组中除了位于最后的最大的元素没有参与比较和交换其他元素都完成了比较,此时a[0]位置是数组中第二大的元素。

[8, 7, 6, 5, 4, 3, 2, 1, 0, 9]

继续执行一次第一步和第二步将第二大的元素移动到最后,最大的元素在第一的位置。

[9, 7, 6, 5, 4, 3, 2, 1, 0, 8]

执行第三步将最大的数移动到最后。这时数组的最后两位a[a.count-2]和a[a.count-1]是有序的。

[7, 6, 5, 4, 3, 2, 1, 0, 8, 9]

重复执行a.count-1次上面的操作,数组就可以完成排序。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

实现:

下面是思路实现的代码:

func chulieSort(a:inout [Int]) -> Void {
    for _ in 0..<a.count-1 {
        print("\n")
        for _ in 0..<a.count-1{
            if a[0]>a[1] {
                swap(&a[0], &a[1])
            }
            moveToLast(a: &a, i: 0)
        }
        ///打印数组a 使整个排序的过程更清晰;
        print(a)
        moveToLast(a: &a, i: 0)
        print(a)
    }
}

来一个数组a实验下吧。

var a = [9,8,7,6,5,4,3,2,1,0]

chulieSort(a: &a)

由打印结果可以看出,完美实现。

这次练习的题目虽然对我们的操作做出了限制,但是我们也可以根据题目的限制知道我们能做什么。这样可以将我们能做的操作罗列出来,作为我们实现题目算法的元素。有了一个个的元素更方便我们相互组合实现题目的要求。

转载于:https://my.oschina.net/ruiruiheshui/blog/1488858

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值