import UIKit

/// 冒泡

///

///时O(n2),空O(1) 稳定排序

func Mysort(arr:[Int]) -> [Int]{

var transArr = arr

for i in 0..<transArr.count {

for j in 0..<transArr.count-i-1{

if transArr[j] > transArr[j+1]{

transArr.swapAt(j, j+1)          //交换需要三条语句

}

}

}

return transArr

}

let arr = Mysort(arr: [2,4,1,5,6,8,3])

//插入排序

//时O(n2),空O(1) 稳定排序

func insertSort(arr:[Int]) -> [Int]{

var newArr = arr

for i in 0..<newArr.count{

var j = i - 1

let value = newArr[i]

while j>=0 && newArr[j] > value{

newArr[j+1] = newArr[j] //比value的的都往后移动一位移动数据

j -= 1

}

newArr[j+1] = value//j+1的位置就是要插入的位置

}

return newArr

}

let arr1 = insertSort(arr: [2,4,1,5,6,8,3,-3,4,-1])

func optionSort(arr:[Int]) -> [Int]{

var newArr = arr

for i in 0..<newArr.count {

var minValue = newArr[i]

var minIndex = i

for j in i+1 ..< newArr.count {

if minValue > newArr[j] {

minValue = newArr[j]

minIndex = j

}

}

newArr.swapAt(minIndex, i)

}

return newArr

}

//let arr2 = optionSort(arr: [2,4,1,5,6,8,3,-3,4,-1])

//快速排序 O(nlogn) 原地 稳定排序

func quickSort(arr:inout [Int],low:Int,high:Int){

if low >= high {

return

}

let point = partition(arr: &arr,low: low,high: high)

quickSort(arr: &arr, low: low, high: point-1)

quickSort(arr: &arr, low: point+1, high: high)

}

//找临界点的位置

func partition(arr:inout [Int],low:Int,high:Int)->Int{

let pointV = arr[high]

var i = low

for j in low...high-1 {

if arr[j] < pointV {

arr.swapAt(i, j)

i+=1

}

}

arr.swapAt(i, high)

return i

}

func quickSort(arr:[Int]) ->[Int]{

var newArr = arr

quickSort(arr: &newArr, low: 0, high: arr.count - 1)

return newArr

}

//let arr2 = quickSort(arr: [2,4,1,5,6,8,3,-3,4,-1])

//归并 O(nlogn) 非原地排序O(n) 非稳定排序

func mergeSort(arr:[Int]) -> [Int]{

var tempArr : [[Int]] = []

for item in arr {

var subArr : [Int] = []

subArr.append(item)

tempArr.append(subArr)

}

while tempArr.count != 1 {

var i = 0

while i < tempArr.count - 1{

tempArr[i] = merge(arr1: tempArr[i], arr2: tempArr[i+1])

tempArr.remove(at: i+1)

i += 1

}

}

return tempArr.first!

}

//合并两个有序数组,合并之后仍是有序数组

func merge(arr1:[Int],arr2:[Int]) -> [Int]{

var newArr = [Int]()

var i = 0

var j = 0

while i<arr1.count && j<arr2.count {

if arr1[i] < arr2[j]{

newArr.append(arr1[i])

i+=1

}else{

newArr.append(arr2[j])

j+=1

}

}

while i < arr1.count {

newArr.append(arr1[i])

i += 1

}

while j < arr2.count {

newArr.append(arr2[j])

j += 1

}

return newArr

}

//let arr2 = mergeSort(arr: [2,4,1,5,6,8,3,-3,4,-1])

//基数排序

func BaseSort(arr:inout [Int]) {

if arr.count == 0 {

return

}

var list:[[Int]] = []

for _ in 0..<10 {

let temp:[Int] = []

list.append(temp)

}

let maxDigit:Int = maxlength(arr: arr)//最大的位数

var tempArr:[Int] = arr

for i in 0..<maxDigit {

for j in 0..<arr.count {

let index:Int = highDigit(num: tempArr[j], index: i)

list[index].append(tempArr[j]) //放入相应的桶中

}

saveBucketData(bucketlist: &list, arr: &tempArr)

}

arr = tempArr

}

// 桶的数据插入数组

private func saveBucketData(bucketlist:inout [[Int]],arr:inout [Int]) {

var index:Int = 0

for i in 0..<bucketlist.count {

var bucket:[Int] = bucketlist[i]

if bucket.count > 0 {

for j in 0..<bucket.count {

arr[index] = bucket[j]

index += 1

}

}

bucketlist[i].removeAll() // 注意清空桶数据

}

}

//取出某位上的数字

private func highDigit(num:Int,index:Int)->Int {

let base:Double = pow(10, Double(index))

let high:Int = (num / Int(base)) % 10

return high

}

// 最大数字的位数

private func maxlength(arr:[Int])->Int {

var max:Int = 0

for i in 0..<arr.count {

let count:Int = positionOfNum(number: arr[i])

if count > max {

max = count

}

}

return max

}

// 统计数字的位数

private func positionOfNum(number:Int)->Int {

var count:Int = 0

var num:Int = number

while num%10 > 0  {

count += 1

num = num / 10

}

return count

}

var inters = [2,4,5,7,1,6,3]

inters.replaceSubrange(0..<3, with: [2,6,7])

inters.dropLast()

let a1 = [2,4,3,2]

let a2 = [2,4,4,3]

//n2 + n2 + n

//n2

var a22 = a2

//for num1 in a1 {

//    for index in 0..<a22.count{

////        if index < a22.count{    //加上这个条件判断就没错了

//        if num1 == a22[index]{

//            a22.remove(at: index)   //经典的l遍历删除错误

//        }

//

////        }

//    }

//}

class Person :Equatable{

var age:Int

var name:String

init(age:Int,name:String) {

self.age = age

self.name = name

}

static func == (lhs: Person, rhs: Person) -> Bool{

let point = Unmanaged<AnyObject>.passUnretained(lhs as AnyObject).toOpaque()

let point1 = Unmanaged<AnyObject>.passUnretained(rhs as AnyObject).toOpaque()

return point.hashValue == point1.hashValue

}

}

swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序的更多相关文章

  1. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  2. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  3. 理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  4. 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

    引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...

  5. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  6. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  7. JavaScript实现冒泡排序、快速排序、插入排序

    JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51  来源:  作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...

  8. 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列

    目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...

  9. 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  10. 交换排序:冒泡排序vs快速排序

    在开发的过程中, 经常会遇到集合排序, 那么一般情况下, 我们都是使用list.OrderBy()的方式来排序, 也无需关注到里面算法的实现是个什么样子. 正好这几天准备回顾一下数据结构与算法. 首先 ...

随机推荐

  1. git log详细使用参数

    1. 可以看到fileName相关的commit记录 git log filename 2. 可以显示每次提交的diff git log -p filename 3. 只看某次提交中的某个文件变化,可 ...

  2. [TimLinux] django CentOS7中django+httpd+mod_wsgi中文UnicodeEncodeError错误

    1. 错误 web端访问页面,页面内的view函数要写一个含有中文名字的文件,出现了这个错误.在PyCharm开发调皮环境中不存在这样的错误,把系统部署到http, mod_wsgi时出现. 2. 定 ...

  3. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  4. JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...

  5. [Input-number]数字输入框组件

    需求 加.减按钮 初始值 最大.最小值 数值改变时,触发一个自定义事件来通知父组件 目录文件 index.html 入口页 input-number.js 数字输入框组件 index.js 根实例 实 ...

  6. 【重温基础】11.Map和Set对象

    本文是 重温基础 系列文章的第十一篇. 今日感受:注意身体,生病花钱又难受. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1.语法和数据类型 [重温基础]2 ...

  7. 关于Java调用接入微信、支付宝支付提现

    前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...

  8. vue+element 中 el-input框 限制只能输入数字及一位小数

    仅个人经验,希望能帮到有需要的人. 第一次写 就话不多说了直接上代码. <el-input @keyup.native="proving(index)" v-model=&q ...

  9. 《Java练习题》习题集一

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...

  10. 准确率、精确率、召回率、F-Measure、ROC、AUC

    先理解一下正类(Positive)和负类(Negetive),比如现在要预测用户是否点击了某个广告链接,点击了才是我们要的结果,这时,点击了则表示为正类,没点击则表示为负类. TP(True Posi ...