加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,

发布时间:2020-12-14 04:26:01 所属栏目:百科 来源:网络整理
导读: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]{ ? ? ? ? ?

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,3,-3,-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,-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,high: point-1)

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

?

}

//找临界点的位置

func partition(arr:inout [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,-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,-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,7,3]

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

inters.dropLast()

?

let a1 = [2,2]

let a2 = [2,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

?

? ? }

?? ?

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读