亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift中排序算法的簡單取舍詳解

2020-03-09 17:42:17
字體:
來源:轉載
供稿:網友

前言

對于iOS開發者來說, 算法的實現過程其實并不怎么關心, 因為只需要調用高級接口就可以得到系統最優的算法, 但了解輪子背后的原理才能更好的取舍, 不是么?下面話不多說了,來一起看看詳細的介紹吧。

選擇排序

我們以[9, 8, 7, 6, 5]舉例.

[9, 8, 7, 6, 5]

第一次掃描, 掃描每一個數, 如比第一個數小則交換, 直到找到最小的數, 將其交換至下標0.

[8, 9, 7, 6, 5][7, 9, 8, 6, 5][6, 9, 8, 7, 5][5, 9, 8, 7, 6]

第二次掃描, 由于確定了第一個數, 則從第二個數開始掃描, 邏輯同上取得次小的數交換至下標1.

[5, 8, 9, 7, 6][5, 7, 9, 8, 6][5, 6, 9, 8, 7]

第三次掃描, 跳過兩個數, 從第三個數開始掃描, 并交換取得下標2.

[5, 6, 8, 9, 7][5, 6, 7, 9, 8]

第四次掃描, 套用上述邏輯取得下標3.

[5, 6, 7, 8, 9]

由于最后只有一位數, 不需要交換, 則無需掃描.

了解了邏輯, 我們來看代碼該怎么寫;

func selectSort(list: inout [Int]) { let n = list.count for i in 0..<(n-1) { var j = i + 1 for _ in j..<n {  if list[i] > list[j] {  list[i] ^= list[j]  list[j] ^= list[i]  list[i] ^= list[j]  }  j += 1 } }}

外層循環取從0掃描到n-1, i代表了掃描推進的次數.

內層循環從i+1, 掃描到最后一位, 逐個比較, 如果比i小則交換.

選擇排序(優化)

上述我們通過了非常簡單的邏輯闡述了選擇排序, 果然, 算法沒有想象中難吧. 接下來, 我們來看看如何優化這個排序算法.

我們同樣以[9, 8, 7, 6, 5]舉例.

[9, 8, 7, 6, 5]

第一次掃描, 和之前一樣掃描, 但只記住最小值的下標, 退出內層循環時交換.

[5, 8, 7, 6, 9]

第二次掃描, 確定第一位最小值后推進一格, 邏輯同上進行交換.

[5, 6, 7, 8, 9]

我們可以明顯的看到優化的效果, 交換的次數降低了, 因為我們不是每次交換數值, 而是用指針記錄后跳出內層循環后進行交換.

我們來看下代碼該如何優化:

func optimizationSelectSort(list: inout [Int]) { let n = list.count var idx = 0 for i in 0..<(n - 1) { idx = i; var j = i + 1 for _ in j..<n {  if list[idx] > list[j] {  idx = j;  }  j += 1 } if idx != i {  list[i] ^= list[idx]  list[idx] ^= list[i]  list[i] ^= list[idx] } }}

通過idx記錄最小值的下標, 如果下標和當前值不等則交換數值.

冒泡排序

接下來我們來看冒泡排序, 同樣以[9, 8, 7, 6, 5]為例.

[9, 8, 7, 6, 5]

第一次掃描, 同樣掃描每一個數, 不同的是, 有兩個指針同時向前走, 如果n>n-1則交換. 確定最末值為最大值.

[8, 9, 7, 6, 5][8, 7, 9, 6, 5][8, 7, 6, 9, 5][8, 7, 6, 5, 9]

第二次掃描, 從頭進行掃描, 由于以確定最末尾為最大值, 則少掃描一位.

[7, 8, 6, 5, 9][7, 6, 8, 5, 9][7, 6, 5, 8, 9]

第三次掃描, 和上述邏輯相同.

[6, 7, 5, 8, 9][6, 5, 7, 8, 9]

第四次掃描, 得到排序完成的值.

[5, 6, 7, 8, 9]

上述可能不好理解, 多看幾遍應該可以.

如果還是理解不能, 我們就來看看代碼吧;

func popSort(list: inout [Int]) { let n = list.count for i in 0..<n-1 { var j = 0 for _ in 0..<(n-1-i) {  if list[j] > list[j+1] {  list[j] ^= list[j+1]  list[j+1] ^= list[j]  list[j] ^= list[j+1]  }  j += 1 } }}

外層循環同樣從0掃描到n-1, 這點不贅述.

內層循環從頭也就是0掃描到n-1-i, 也就是每次掃描少掃一位, 應為每次都會確定最末位為最大值.

冒泡排序(優化)

冒泡排序的優化就沒有選擇排序的優化那么給力了, 還有可能產生負優化, 慎用!!

這次我們用[5, 6, 7, 9, 8]來舉例.

--- scope of: popsort ---[5, 6, 7, 9, 8][5, 6, 7, 8, 9]--- scope of: opt_popsort ---[5, 6, 7, 9, 8][5, 6, 7, 8, 9]

這個優化并不是特別直觀, 最好運行我的源碼. 優化來自于如果已經排序完成則不用掃描空轉. 上面的空行就是空轉.

func optimizationPopSort(list: inout [Int]) { let n = list.count for i in 0..<n-1 {  var flag = 0  var j = 0  for _ in 0..<(n-1-i) {   if list[j] > list[j+1] {    list[j] ^= list[j+1]    list[j+1] ^= list[j]    list[j] ^= list[j+1]    flag = 1   }   j += 1  }  if flag == 0 {   break  } }}

就是加了一個標志位來判斷是否跳出掃描.

快速排序

快速排序, 不是特別好舉例, 但是最重要的一個排序.

func quickSort(list: inout [Int]) { func sort(list: inout [Int], low: Int, high: Int) {  if low < high {   let pivot = list[low]   var l = low; var h = high   while l < h {    while list[h] >= pivot && l < h {h -= 1}    list[l] = list[h]    while list[l] <= pivot && l < h {l += 1}    list[h] = list[l]   }   list[h] = pivot   sort(list: &list, low: low, high: l-1)   sort(list: &list, low: l+1, high: high)  } } sort(list: &list, low: 0, high: list.count - 1)}

我們直接看代碼就能看出, 我們將下標0作為標尺, 進行掃描, 比其大的排右面, 比其小的排左邊, 用遞歸的方式進行排序而成, 由于一次掃描后同時進行了模糊排序, 效率極高.

排序取舍

我們將上述所有的排序算法和系統的排序進行了比較, 以10000個隨機數為例.

scope(of: "sort", execute: true) { scope(of: "systemsort", execute: true, action: {  let list = randomList(10000)  timing {_ = list.sorted()}//  print(list.sorted()) })  scope(of: "systemsort2", execute: true, action: {  let list = randomList(10000)  timing {_ = list.sorted {$0 < $1}}//  print(list.sorted {$0 < $1}) })  scope(of: "selectsort", execute: true, action: {  var list = randomList(10000)  timing {selectSort(list: &list)}//  print(list) }) scope(of: "opt_selectsort", execute: true, action: {  var list = randomList(10000)  timing {optimizationSelectSort(list: &list)}//  print(list) }) scope(of: "popsort", execute: true, action: {  var list = randomList(10000)  timing {popSort(list: &list)}//  print(list) }) scope(of: "opt_popsort", execute: true, action: {  var list = randomList(10000)  timing {optimizationPopSort(list: &list)}//  print(list) }) scope(of: "quicksort", execute: true, action: {  var list = randomList(10000)  timing {quickSort(list: &list)}//  print(list) })}
--- scope of: sort ------ scope of: systemsort ---timing: 0.010432243347168--- scope of: systemsort2 ---timing: 0.00398015975952148--- scope of: selectsort ---timing: 2.67806816101074--- scope of: opt_selectsort ---timing: 0.431572914123535--- scope of: popsort ---timing: 3.39597702026367--- scope of: opt_popsort ---timing: 3.59421491622925--- scope of: quicksort ---timing: 0.00454998016357422

我們可以看到, 其中我寫的快排是效率最高的, 和系統的排序是一個數量級的, 而選擇比冒泡的效率要高, 而令人疑惑的是同樣是系統的排序加上{$0 < $1}比較規則, 效率會有數量級的提升.

現在大家知道如何選擇排序算法了么?

二分搜索

@discardableResult func binSearch(list: [Int], find: Int) -> Int { var low = 0, high = list.count - 1 while low <= high {  let mid = (low + high) / 2  if find == list[mid] {return mid}  else if (find > list[mid]) {low = mid + 1}  else {high = mid - 1} } return -1;}
@discardableResult func recursiveBinSearch(list: [Int], find: Int) -> Int { func search(list: [Int], low: Int, high: Int, find: Int) -> Int {  if low <= high {   let mid = (low + high) / 2   if find == list[mid] {return mid}   else if (find > list[mid]) {    return search(list: list, low: mid+1, high: high, find: find)   }   else {    return search(list: list, low: low, high: mid-1, find: find)   }  }  return -1; } return search(list: list, low: 0, high: list.count - 1, find: find)}

二分搜索的原理就不多說了, 就是折半折半再折半, 這種搜索算法的關鍵就是要有序, 所以配合上合適的排序算法才是最重要的!

源碼下載:github  或者 本地下載

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久人成| 欧美性开放视频| 岛国av一区二区三区| 精品久久香蕉国产线看观看亚洲| 91地址最新发布| 在线看国产精品| 97色在线播放视频| 亚洲欧洲日本专区| 欧美性xxxxxxx| 久久久久久美女| 国产精品夜间视频香蕉| 日韩精品日韩在线观看| 97热精品视频官网| 日韩欧美国产骚| 青青草99啪国产免费| 97福利一区二区| 国产精品免费观看在线| 福利一区福利二区微拍刺激| 国产欧美精品在线播放| 亚洲国产精品大全| 怡红院精品视频| 91国产美女在线观看| 欧美激情视频一区二区三区不卡| 久久精品国产亚洲精品2020| 欧美人在线视频| 韩国一区二区电影| 亚洲精品美女网站| 欧美激情视频网| 欧美久久精品午夜青青大伊人| 毛片精品免费在线观看| 亚洲福利小视频| 中文字幕成人在线| 97视频在线观看亚洲| 91av在线国产| 91精品视频在线| 国产精品午夜视频| 日韩美女视频免费看| 日韩在线观看免费全| 成人免费视频a| 日韩亚洲一区二区| 欧美精品免费在线观看| 日韩欧美国产中文字幕| 中文字幕在线精品| 奇米成人av国产一区二区三区| 久久影视免费观看| 中文字幕精品一区久久久久| 在线看国产精品| 成人一区二区电影| 国产精品视频一区国模私拍| 欧美在线中文字幕| 日韩精品免费综合视频在线播放| 国产精品精品久久久久久| 日产日韩在线亚洲欧美| 欧美一级视频免费在线观看| 欧美性猛交xxxx乱大交极品| 日韩一区二区三区在线播放| 久久亚洲影音av资源网| 国产精品影院在线观看| 国产精品久久久久9999| 久久久久久久久久久av| 国产精品久久久久久久午夜| 国产精品久久久久77777| 亚洲午夜国产成人av电影男同| 精品成人久久av| 91精品免费看| xvideos成人免费中文版| 国外成人在线直播| 一本色道久久88精品综合| 亚洲欧美精品一区| 亚洲国产私拍精品国模在线观看| 最近中文字幕2019免费| 成人精品久久一区二区三区| 日韩欧美在线中文字幕| 亚洲天堂开心观看| 国产成人精品一区二区在线| 日韩高清电影好看的电视剧电影| 欧美精品亚州精品| 91久久精品久久国产性色也91| 91精品国产色综合| 欧美成人亚洲成人| 国产精品亚洲视频在线观看| 最近更新的2019中文字幕| 日韩av网站电影| 国产成人精品免高潮在线观看| 日韩在线播放一区| 亚洲欧美在线x视频| 日韩欧美在线视频| 国产一区二区三区视频| 国产精品免费久久久久影院| 中文字幕精品www乱入免费视频| 亚洲人成网站色ww在线| 国产欧美日韩专区发布| 成人97在线观看视频| 欧美日韩国产精品一区| 日本一区二三区好的精华液| 日韩少妇与小伙激情| 欧美第一黄网免费网站| 欧美日韩免费看| 欧美性理论片在线观看片免费| 国产精品国产亚洲伊人久久| 中文字幕亚洲字幕| 久久久免费精品视频| 亚洲iv一区二区三区| 亚洲欧美一区二区三区四区| 亚洲黄色av网站| 97国产真实伦对白精彩视频8| 国产精品视频男人的天堂| 91超碰中文字幕久久精品| 欧美大片免费观看在线观看网站推荐| 欧美激情一级欧美精品| 日韩影视在线观看| 色综合久久精品亚洲国产| 91精品国产91久久久久久| 最近中文字幕2019免费| 黑人巨大精品欧美一区二区一视频| 亚洲美女精品成人在线视频| 九九热这里只有精品免费看| 亚洲激情成人网| 成人亚洲激情网| 日韩在线一区二区三区免费视频| 欧美成人自拍视频| 日韩在线资源网| 中文字幕亚洲欧美日韩高清| 精品少妇v888av| 欧美影院久久久| 久久久亚洲精选| 亚洲成人精品视频在线观看| 欧美华人在线视频| 国产免费成人av| 久久久久中文字幕2018| 国模叶桐国产精品一区| 国产亚洲欧美日韩美女| 久久精品视频免费播放| 国产欧美日韩丝袜精品一区| 欧美日韩成人黄色| 国产亚洲精品成人av久久ww| 成人欧美一区二区三区在线湿哒哒| 欧美人成在线视频| 爱福利视频一区| 国产九九精品视频| 中文字幕日韩av| 久久人人爽亚洲精品天堂| 午夜精品一区二区三区在线| 2020久久国产精品| 欧美性xxxx极品高清hd直播| 久99九色视频在线观看| 亚洲精品在线不卡| 亚洲欧美中文日韩在线| 欧美成人精品不卡视频在线观看| www.xxxx欧美| 美日韩精品视频免费看| 亚洲精品久久久久久久久| 日韩av免费网站| 亚洲国产精品成人精品| 最近2019年好看中文字幕视频| 国产精品成人av性教育| 亚洲欧美激情一区| 日韩在线不卡视频| 亲子乱一区二区三区电影| 国精产品一区一区三区有限在线| 中文字幕v亚洲ⅴv天堂| 亚洲午夜未满十八勿入免费观看全集| 欧美性感美女h网站在线观看免费| 欧美日韩亚洲一区二区|