Swift的排序算法总结

摘要:
让我们看看swift中基于Array的扩展气泡排序。选择排序和快速排序*/extensionArraywhereElement:Comparable{mutatingfuncbubbleSort(){foriin0..˂self.count-1{forjin.reversed(){//后者小于前者,交换位置,即小的增加,大的减少ifself[j]˂self[j-1]{swap[j]}因为它是一种排序,所以元素必须满足协议,并且是可比较的*此外,i==j的过程必须恰好是i+或j-完成的时间,此时循环结束)=这里总结了i{swap}}}}Swift的排序算法。

下面让我们一起来见识一下swift中基于Array的扩展的冒泡排序,选择排序和快速排序吧。

1.冒泡排序

冒泡排序再基础不过了,这里就不再讲其原理了,实在不会可以看下百度百科冒泡排序
既然冒泡排序避免不了数组中两个数据交换,先写一个交换函数

// 交换数组中i和j两个位置的数据
extension Array {
    fileprivate mutating func swap(i:Int,j:Int) { 

        let temp = self[i]
   self[i] = self[j]
   self[j] = temp

    }
}

下面就是排序了也很简单就不多解释了

// MARK: - 冒泡排序
/**
* 通过与相邻元素的比较和交换,把小的数交换到最前面。
*/

extension Array where Element:Comparable {
mutating func bubbleSort() {
    for i in 0..<self.count-1 {
        for j in (i+1...self.count-1).reversed() {
           // 后者小于前者,交换位置,即小的往上升大的往下沉
           if self[j] < self[j-1] {
               swap(i: j, j: j-1)
            }
         }
      } 
   }
}

因为是排序,所以元素必须满足协议是可比较的。
下面快速排序和选择排序也是同样的道理。

2.快速排序

/** 快速排序的算法思想

 *  一趟快速排序的算法是:

 *   1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;

 *   2、以第一个数组元素作为基准数据,赋值给key,即key=A[0];

 *   3、从j开始向前搜索,即由后开始向前搜索(j减1),找到第一个小于key的值A[j],将A[j]和A[i]互换;

 *   4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

 *   5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,

 *     使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。

 *     另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

 */

extension Array where Element:Comparable {

    private mutating func quickPartition(left:Int, right:Int)->Int {

        var right = right
   var left = left

        // 记录哪个是基准数
     let base = self[left]

        // 记录基准数位置
     let baseIndex = left

        // 先从右边往左边扫描,找到第一个比base要小的数,但是不能与left相遇
   while left < right && self[right] >= base {
           right = right-1
}

        // 再从左边往右边扫描,找到第一个比base还要大的数,但是不能与right相遇
   while left < right && self[left] <= base {
         left = left+1
}

        // 交换 左边比base大的数和右边比base小的数
    swap(i: left,j: right)

        // 交换左边比base大的数和基准数
    swap(i: baseIndex,j: left)

        // 返回新的基准数
    return left

}

/// 快速排序

/// - Parameters:
///   - a: 数组a
///   - left: 左边索引
///   - right: 右边索引

    private mutating func quickSort(left: Int, right: Int) {

        // 排序完毕,退出递归
    if left >= right {
        return
   }

        // 每一趟划分,使左边的比基准小,右边的比基准大,并返回新的基准的位置

        let baseIndex = quickPartition(left: left, right: right)

        // 判断左边是否排完,没排完递归排左边部分
    if baseIndex - 1 > left {
        quickSort(left: left, right: baseIndex - 1)
    }

        // 判断右边是否排完,没排完递归排右边部分
    if baseIndex + 1 < right {
        quickSort(left: baseIndex + 1, right: right)
    }

    }

    mutating func quickSort() {
    quickSort(left: 0, right: self.count-1)

    }

}

3.选择排序

// MARK: - 选择排序

/** 选择排序算法思想
*  每一趟从前往后查找出值最小的索引(下标),最后通过比较是否需要交换。每一趟都将最小的元素交换到最前面。
*  大致过程
*  6, 4, 9, 7, 5(开始)
*  4, 6, 9, 7, 5(第一趟:将最小的4与6交换,使这一趟最小值4放到最前面)
*  4, 5, 9, 7, 6(第二趟:将最小的5与6交换,使这一趟最小值5放到最前面)
*  4, 5, 6, 7, 9(第三趟:将最小的6与9交换,使这一趟最小值6放到最前面)
*  4, 5, 6, 7, 9(第四趟:不需要交换,排序完成)
*/

extension Array where Element:Comparable {

    mutating func selectorSort() {

        var min = 0

        // 只需要n-1趟即可,到最后一趟只有一个元素,一定是最小的了
    for i in 0..<self.count-1 {

            // 每一趟的开始,假设该趟的第一个元素是最小的
    min = i

            // 查找该趟有没有更小的,如果找到更小的,则更新最小值的下标
     for j in i+1..<self.count-1 {

                if self[j] < self[min] {
        min = j

                }
   }

            // 如果该趟的第一个元素不是最小的,说明需要交换
    if min != i {
        swap(i: min, j: i)

           }          
   }

   }  

}

Swift的排序算法就总结到这里。

如果大家觉得这篇博文整理得不错,就给点个赞吧。 如果在再哪里整理得有疏忽的地方,还希望各位博友的指点。

感谢各位博友对这篇文章的支持哦!!! 谢谢。

免责声明:文章转载自《Swift的排序算法总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用Java语言开发微信公众平台(五)——获取access_tokenC++枚举变量与switch下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

问题 E: 冒泡排序算法(C#)

题目描述 使用C#编写一个控制台应用。输入10个整数存入数组中,然后使用冒泡排序算法对一维数组的元素从小到大进行排序,并输出。 输入 在控制台中输入数字,存入一维数组 输出 输出排序后的数组 样例输入 copy 87 85 89 84 76 82 90 79 78 68 Made by hxl. 样例输出 68 76 78 79 82 84 85...

Java常用的数组排序算法(面试宝典)

这段时间有些忙,今天空闲出来给大家分享下Java中常用的数组排序算,有冒泡排序、快速排序、选择排序、插入排序、希尔算法、并归排序算法、堆排序算法,以上排序算法中,前面几种相对后面的比较容易理解一些。下面为大家一一介绍,写的不好,大佬绕过。 1、冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交...

Python冒泡排序(2)

冒泡排序:通过与相邻元素比较的方式每次将一个数归位 Python代码: """ 冒泡排序(2) 在未排序的数中,通过两两比较[换位]的方式,将最小的数移至首位 N个数排序,则需要执行N-1轮,第1轮比较N-1次,后续每轮比上一轮少比较1次 本例中: 第1轮将0放到正确位置; 第2轮将1放到正确位置; ...... 第9轮将8放到正确位置; 此方法中,...

字符串的冒泡排序

字符串的冒泡排序       我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。 输入格式:      输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。 输出格式:     输出...