swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序
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基数排序的更多相关文章
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- 理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置
本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...
- 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程
引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...
- ios swift 实现饼状图进度条,swift环形进度条
ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51 来源: 作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...
- 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列
目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
- 交换排序:冒泡排序vs快速排序
在开发的过程中, 经常会遇到集合排序, 那么一般情况下, 我们都是使用list.OrderBy()的方式来排序, 也无需关注到里面算法的实现是个什么样子. 正好这几天准备回顾一下数据结构与算法. 首先 ...
随机推荐
- 洛谷 题解 CF299A 【Ksusha and Array】
本蒟蒻又双叒叕被爆踩辣! 这就是道大水题 首先,题目意思: 给你n个数,要你找这些数字中找到一个能够被这些所有数字整除的数,若有多个,可任意输出其中一个,其实答案只有一个,因为在大于等于自己的数中能被 ...
- 《手把手教你》系列进阶篇之2-python+ selenium自动化测试 - python基础扫盲(详细教程)
1. 简介 这篇文章主要是分享讲解一下,如何封装自己用到的方法和类.以便方便自己和别人的调用,这样就可以避免重复地再造轮子. 封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承 ...
- idea建立项目关联到git仓库操作步骤
eg:创建一个名为demo的git项目 创建git远程项目,命名为[/demo] 在[D:\workspace\gf]创建本地项目[demo] 在idea里选择[VCS]->[Checkout ...
- AddTransient、AddSingleton、AddScoped的区别
权重: AddSingleton→AddTransient→AddScoped AddSingleton的生命周期: 项目启动-项目关闭 相当于静态类 只会有一个 AddScoped的生命周期: ...
- 【H5】344- 微信 H5 页面兼容性解决方案
点击上方"前端自习课"关注,学习起来~ 最近给公司微信公众号,写了微信h5业务页面,总结分享一下前端开发过程中的几个兼容性坑,项目直接拿的公司页面,所以下文涉及图片都模糊处理了. ...
- 回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss
均方误差(Mean Square Error,MSE)和平均绝对误差(Mean Absolute Error,MAE) 是回归中最常用的两个损失函数,但是其各有优缺点.为了避免MAE和MSE各自的优缺 ...
- 4种MySQL分页查询优化的方法,你知道几个?
前言 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的 ...
- 基于 HTML5 WebGL 构建智能数字化城市 3D 全景
前言 自 2011 年我国城镇化率首次突破 50% 以来,<新型城镇化发展规划>将智慧城市列为我国城市发展的三大目标之一,并提出到 2020 年,建成一批特色鲜明的智慧城市.截至现今,全国 ...
- jq触发oninput事件
之前一直在用jq的change()方法来处理输入框的值变化事件,以及触发输入框的变化事件. 后来发现change()方法有个弊端,change事件的发生条件是:输入框的值value发生变化,并且输入框 ...
- Java8-Lamda和Stream原理引入
一说明 这边文章主要是带大家为什么会有lamda表达式的出现,流式思想的产生.具体的Lamda表达式操作,Stream流会在后面的文章更新,有兴趣的朋友也可以加一下我微信公众号,分享学习干货. 二ja ...