swift算法之排序:(零)排序算法总结

1、排序算法总结

 

 

2、排序算法的时间复杂度比较

常用的时间复杂度大小为

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

3、稳定性算法

什么是稳定性?

答:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri = rj,且ri 在 rj之前,而在排序后的序列中,ri仍在rj前,则称算法是稳定的,反之是不稳定的

常见的算法主要有:冒泡、选择、插入、快排、堆排、希尔、桶等

1)稳定算法:冒泡、插入、归并、基数、桶

2)不稳定算法:选择、快排、堆排、希尔

这些算法会在后续文章中一一讲解

 

4、排序算法的封装及调用

1)自定义一个协议

//自定义排序协议
protocol SortType {
    func sort(_ items : Array<Int>)->Array<Int>
}

2)所有排序类遵守协议,并实现协议方法

//冒泡排序
class BubbleSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("冒泡排序")
        var list = items
        if list.count > 0 {
            list = SortSummary.bubbleSort(list)
            //list = SortSummary.bubbleSort1(list)
            //list = SortSummary.bubbleSort2(list)
        }
        return list
    }
}

//插入排序
class InsertSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("插入排序")
        var list = items
        if list.count > 0 {
            list = SortSummary.insertSort(list)
            //list = SortSummary.insertSort1(list)
            //list = SortSummary.insertSort1(list)
            //list = SortSummary.insertSort3(list, <)
        }
        return list
    }
}

//选择排序
//插入排序
class ChooseSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("选择排序")
        var list = items
        if list.count > 0 {
            list = SortSummary.chooseSort(list)
        }
        return list
    }
}

//堆排序
class HeapSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("堆排序")
        var list = items
        if list.count > 0 {
            SortSummary.heapSort(&list)
        }
        return list
    }
}

//归并排序
class MergeSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("归并排序")
        var list = items
        if list.count > 0 {
            list = SortSummary.mergeSort(list)
            //list = SortSummary.mergeSortBottomUp(list, <)
        }
        return list
    }
}

//快速排序
class QuickSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("快速排序")
        var list = items
        if list.count > 0 {
            SortSummary.quickSort(&list, 0, items.count-1)
        }
        return list
    }
}

//希尔排序
class ShellSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("希尔排序")
        var list = items
        if list.count > 0 {
            SortSummary.shellSort(&list)
        }
        return list
    }
}

//桶排序
class BucketSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("桶排序")
        var list = items
        let max = maxNum(list)
        if list.count > 0 {
            list = SortSummary.bucketSort(list, max)
        }
        return list
    }
    
    private func maxNum(_ list : Array<Int>)->Int{
        var max = list[0]
        for i in list {
            if i > max {
                max = i
            }
        }
        return max+1
    }
}


//基数排序
class RadixSort:SortType{
    func sort(_ items: Array<Int>) -> Array<Int> {
        print("基数排序")
        var list = items
        if list.count > 0 {
            SortSummary.radixSort(&list)
        }
        return list
    }
    
}

3)调用

func sortClassTest(){
       commonSort(BubbleSort())
        commonSort(InsertSort())
        commonSort(ChooseSort())
        commonSort(HeapSort())
        commonSort(MergeSort())
        commonSort(QuickSort())
        commonSort(ShellSort())
        commonSort(BucketSort())
        commonSort(RadixSort())
    }
    private func commonSort(_ sortObject : SortType){
        let list : Array<Int> = [62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]
        let sortList = sortObject.sort(list)
        print(sortList)
        print("\n")
    }

具体的排序代码 见github项目中的 SortClass.swift 和 SortSummary.swift,调用在ViewController.swift类中

5、排序实战

描述:已知有很多会议,如果有这些会议时间有重叠,则将它们合并。

例:有一个会议的时间为3点到5点,另一个会议时间为4点到6点,那么合并之后的会议时间为3点到6点

 

思想:遍历一次数组,然后归并所有重叠时间,将数组按照会议开始的时间排序

具体实现:

1)定义会议类

//定义会议的类
public class MeetingTime{
    //会议开始时间
    public var start : Int
    //会议结束时间
    public var end : Int
    
    //初始化
    public init(_ start : Int, _ end : Int){
        self.start = start
        self.end = end
    }
}

2)排序实现

func meetingTimeMerge(_ meetingTimes : [MeetingTime])->[MeetingTime]{
        var meetingTimes = meetingTimes
       //处理特殊情况
        guard meetingTimes.count > 1 else {
            return meetingTimes
        }
        
        //排序
        var meetingSort = meetingTimes.sort(){
            if $0.start != $1.start {
                return $0.start < $1.start
            }else{
                return $0.end < $1.end
            }
        }
        
        //新建结果数组
        var res = [MeetingTime]()
        res.append(meetingTimes[0])
        
        //遍历排序后的数组,并与结果数组归并
        for i in 1..<meetingTimes.count {
            let last = res[res.count-1]
            let current = meetingTimes[i]
            if current.start > last.end {
                res.append(current)
            }else{
                last.end = max(last.end, current.end)
            }
        }
        return res
    }
}

3)调用

var array10 = [MeetingTime.init(1, 3), MeetingTime.init(5, 6), MeetingTime.init(4, 7), MeetingTime.init(2, 3)]
array10 = SortSummary.meetingTimeMerge(array10)
 for i in array10 {
     print(i.start,i.end,"\n")
 }

运行结果:

1 3 
4 7 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值