快速排序算法在Swift编程中的几种代码实现示例

 更新时间:2016年07月06日 10:32:37   作者:FlyElephant  
快速排序是一种不稳定的排序,存在着优化空间,这里我们来看快速排序算法在Swift编程中的几种代码实现示例:

总所周知 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。
基本原理是:
数组a = [1,3,5,7,6,4,2]
1 选定一个 基准 a[0]
2 把比 a[0]小的放左边,比a[0]大的放右边. 中断递归如果少于两个数字 则不执行。
3 然后再分别对两边 执行 1,2,3操作。
对快速排序 的 想法
1 在待排序元素 大部分是有序的情况下, 速度 非常很快。
2 在最差的情况下,速度就很慢了。 相当于冒泡了
3 所以 快排的 优化, 定基准 非常重要,例如待排序是有序的,基准定在中间,xiao'lv
4 时间复杂度为nlogn,不稳定排序

辅助空间

func quickSort(data:[NSInteger])->[NSInteger]{
  if data.count<=1 {
    return data
  }

  var left:[NSInteger]=[]
  var right:[NSInteger]=[]
  let pivot:NSInteger=data[data.count-1]
  for index in 0..<data.count-1 {
    if data[index]<pivot {
      left.append(data[index])
    }else{
      right.append(data[index])
    }
  }

  var result=quickSort(left)
  result.append(pivot)
  let rightResult=quickSort(right)
  result.appendContentsOf(rightResult)
  return result
}

经典快排

func partition(inout data:[NSInteger],low:NSInteger,high:NSInteger) -> NSInteger {

  let root = data[high]
  var index = low
  for i in low...high {
    if data[i]<root {
      if i != index {
        swap(&data[i], &data[index])
      }
      index = index+1
    }
  }

  if high != index {
    swap(&data[high], &data[index])
  }
  return index
}

func quickSort(inout data:[NSInteger],low:NSInteger,high:NSInteger) -> Void {
  if low>high {
    return
  }
  let sortIndex = partition(&data, low: low, high: high)
  quickSort(&data, low: low, high: sortIndex-1)
  quickSort(&data, low: sortIndex+1, high: high)
}

测试代码:

var data:[NSInteger] = [1,2,3,2,4,8,9,10,19,0]
var result=quickSort(data)
print("FlyElephant方案1:-\(result)")

var arr:[NSInteger] = [10,3,17,8,5,2,1,9,5,4]
quickSort(&arr, low: 0, high: arr.count-1)
print("FlyElephant方案2:-\(arr)")

201676102656922.png (351×34)

极简版本    

 import UIKit
   extension Array {
     var decompose : (head: Element, tail: [Element])? {
       return (count > 0) ? (self[0], Array(self[1..<count])) : nil
     }
   }

   func qsortDemo(input: [Int]) -> [Int] {
     if let (pivot, rest) = input.decompose {
       let lesser = rest.filter { $0 < pivot }//这里是小于于pivot基数的分成一个数组
       let greater = rest.filter { $0 >= pivot }//这里是大于等于pivot基数的分成一个数组
       return qsortDemo(lesser) + [pivot] + qsortDemo(greater)//递归 拼接数组
     } else {
       return []
     }
   }

   var a:[Int] = [1,2,4,6,2,4,3,7,8]
   qsortDemo(a)

相关文章

  • Swift教程之下标详解

    Swift教程之下标详解

    这篇文章主要介绍了Swift教程之下标详解,本文讲解了下标语法、下标的使用、下标选项等内容,需要的朋友可以参考下
    2015-01-01
  • 浅谈Swift编程中switch与fallthrough语句的使用

    浅谈Swift编程中switch与fallthrough语句的使用

    这篇文章主要介绍了Swift编程中switch与fallthrough语句的使用,用于基本的流程控制,需要的朋友可以参考下
    2015-11-11
  • Swift中的指针操作和使用详细介绍

    Swift中的指针操作和使用详细介绍

    这篇文章主要介绍了Swift中的指针操作和使用详细介绍,Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象,本文详细讲解了Swift中指针的相关知识,需要的朋友可以参考下
    2015-01-01
  • 纯swift实现ipad版简单美团界面功能

    纯swift实现ipad版简单美团界面功能

    这篇文章主要为大家详细介绍了纯swift实现ipad版简单美团界面功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Swift编程中实现希尔排序算法的代码实例

    Swift编程中实现希尔排序算法的代码实例

    希尔排序是对插入排序的一种改进版本,算法本身并不稳定,存在优化空间,这里我们来讲一下希尔排序的大体思路及Swift编程中实现希尔排序算法的代码实例
    2016-07-07
  • Swift中 !和 ?的区别及使用

    Swift中 !和 ?的区别及使用

    这篇文章主要介绍了Swift中 !和 ?的区别及使用的相关资料,需要的朋友可以参考下
    2016-12-12
  • 关于swift的个人小结

    关于swift的个人小结

    本文是个人对于目前学习swift的一些心得的汇总,这里分享给大家,希望大家能够喜欢
    2016-12-12
  • Swift 中如何使用 Option Pattern 改善可选项的 API 设计

    Swift 中如何使用 Option Pattern 改善可选项的 API 设计

    这篇文章主要介绍了Swift 中如何使用 Option Pattern 改善可选项的 API 设计,帮助大家更好的进行ios开发,感兴趣的朋友可以了解下
    2020-10-10
  • swift中defer几个简单的使用场景详解

    swift中defer几个简单的使用场景详解

    在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果,这篇文章主要介绍了关于swift中defer几个简单的使用场景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用defer具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧。
    2018-03-03
  • Swift 4.0中如何引用3.0的第三方库

    Swift 4.0中如何引用3.0的第三方库

    这篇文章主要给大家介绍了关于在Swift 4.0中如何引用3.0第三方库的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01

最新评论