成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

冒泡排序、快速排序和堆排序的時間復雜度是多少

冒泡排序的時間復雜度:最好情況是“O(n)”,最壞情況是“O(n2)”。快速排序的的時間復雜度:最好情況是“O(nlogn)”,最壞情況是“O(n2)”。堆排序的時間復雜度是“O(nlogn)”。

冒泡排序、快速排序和堆排序的時間復雜度是多少

本教程操作環境:windows7系統、Dell G3電腦。

冒泡排序(Bubble Sort)

時間復雜度

最好的情況:數組本身是順序的,外層循環遍歷一次就完成O(n)

最壞的情況:數組本身是逆序的,內外層遍歷O(n2)

空間復雜度
開辟一個空間交換順序O(1)
穩定性
穩定,因為if判斷不成立,就不會交換順序,不會交換相同元素

  • 冒泡排序它在所有排序算法中最簡單。然而, 從運行時間的角度來看,冒泡排序是最差的一個,它的復雜度是O(n2)

  • 冒泡排序比較任何兩個相鄰的項,如果第一個比第二個大,則交換它們。元素項向上移動至正確的順序,就好像氣泡升至表面一樣,冒泡排序因此得名。

  • 交換時,我們用一個中間值來存儲某一交換項的值。其他排序法也會用到這個方法,因此我 們聲明一個方法放置這段交換代碼以便重用。使用ES6(ECMAScript 2015)**增強的對象屬性——對象數組的解構賦值語法,**這個函數可以寫成下面 這樣:

[array[index1], array[index2]] = [array[index2], array[index1]];

具體實現:

function bubbleSort(arr) {   for (let i = 0; i < arr.length; i++) {//外循環(行{2})會從數組的第一位迭代 至最后一位,它控制了在數組中經過多少輪排序     for (let j = 0; j < arr.length - i; j++) {//內循環將從第一位迭代至length - i位,因為后i位已經是排好序的,不用重新迭代       if (arr[j] > arr[j + 1]) {//如果前一位大于后一位         [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];//交換位置       }     }   }   return arr; }

快速排序

時間復雜度
最好的情況:每一次base值都剛好平分整個數組,O(nlogn)
最壞的情況:每一次base值都是數組中的最大/最小值,O(n2)

空間復雜度
快速排序是遞歸的,需要借助棧來保存每一層遞歸的調用信息,所以空間復雜度和遞歸樹的深度一致
最好的情況:每一次base值都剛好平分整個數組,遞歸樹的深度O(logn)
最壞的情況:每一次base值都是數組中的最大/最小值,遞歸樹的深度O(n)

穩定性
快速排序是不穩定的,因為可能會交換相同的關鍵字。
快速排序是遞歸的,
特殊情況:left>right,直接退出。

步驟:

(1) 首先,從數組中選擇中間一項作為主元base,一般取第一個值

(2) 創建兩個指針,左邊一個指向數組第一個項,右邊一個指向數組最后一個項。移動右指針直到找到一個比主元小的元素,接著,移動左指 針直到我們找到一個比主元大的元素,然后交 換它們,重復這個過程,直到左指針遇見了右指針。這個過程將使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。這一步叫作劃分操作

(3)然后交換主元和指針停下來的位置的元素(等于說是把這個元素歸位,這個元素左邊的都比他小,右邊的都比他大,這個位置就是他最終的位置)

(4) 接著,算法對劃分后的小數組(較主元小的值組成的子數組,以及較主元大的值組成的 子數組)重復之前的兩個步驟(遞歸方法),

遞歸的出口為left/right=i,也就是:

left>i-1 / i+1>right

此時,子數組數組已排序完成。

歸位示意圖:
冒泡排序、快速排序和堆排序的時間復雜度是多少

具體實現:

function quicksort(arr, left, right) {   if (left > right) {     return;   }   var i = left,     j = right,     base = arr[left]; //基準總是取序列開頭的元素   //   var [base, i, j] = [arr[left], left, right]; //以left指針元素為base   while (i != j) {     //i=j,兩個指針相遇時,一次排序完成,跳出循環     // 因為每次大循環里面的操作都會改變i和j的值,所以每次循環/操作前都要判斷是否滿足i<j     while (i < j && arr[j] >= base) {       //尋找小于base的右指針元素a,跳出循環,否則左移一位       j--;     }     while (i < j && arr[i] <= base) {       //尋找大于base的左指針元素b,跳出循環,否則右移一位       i++;     }     if (i < j) {       [arr[i], arr[j]] = [arr[j], arr[i]]; //交換a和b     }   }   [arr[left], arr[j]] = [arr[j], arr[left]]; //交換相遇位置元素和base,base歸位   //   let k = i;   quicksort(arr, left, i - 1); //對base左邊的元素遞歸排序   quicksort(arr, i + 1, right); //對base右邊的元素遞歸排序   return arr; }

參考:https://www.cnblogs.com/venoral/p/5180439.html

堆排序

堆的概念

  • 堆是一個完全二叉樹。
  • 完全二叉樹: 二叉樹除開最后一層,其他層結點數都達到最大,最后一層的所有結點都集中在左邊(左邊結點排列滿的情況下,右邊才能缺失結點)。
  • 大頂堆:根結點為最大值,每個結點的值大于或等于其孩子結點的值。
  • 小頂堆:根結點為最小值,每個結點的值小于或等于其孩子結點的值。
  • 堆的存儲: 堆由數組來實現,相當于對二叉樹做層序遍歷。如下圖:
    冒泡排序、快速排序和堆排序的時間復雜度是多少
    冒泡排序、快速排序和堆排序的時間復雜度是多少

時間復雜度
總時間為建堆時間+n次調整堆 —— O(n)+O(nlogn)=O(nlogn)
建堆時間:從最后一個非葉子節點遍歷到根節點,復雜度為O(n)
n次調整堆:每一次調整堆最長的路徑是從樹的根節點到葉子結點,也就是樹的高度logn,所以每一次調整時間復雜度是O(logn),一共是O(nlogn)

空間復雜度
堆排序只需要在交換元素的時候申請一個空間暫存元素,其他操作都是在原數組操作,空間復雜度為O(1)

穩定性
堆排序是不穩定的,因為可能會交換相同的子結點。

步驟一:建堆

  • 以升序遍歷為例子,需要先將將初始二叉樹轉換成大頂堆,要求滿足:樹中任一非葉子結點大于其左右孩子
  • 實質上是調整數組元素的位置,不斷比較,做交換操作。
  • 找到第一個非葉子結點——Math.floor(arr.length / 2 - 1),從后往前依次遍歷
  • 對每一個結點,檢查結點和子結點的大小關系,調整成大根堆
// 建立大頂堆 function buildHeap(arr) {   //從最后一個非葉子節點開始,向前遍歷,   for (let i = Math.floor(arr.length / 2 - 1); i >= 0; i--) {     headAdjust(arr, i, arr.length); //對每一個節點都調整堆,使其滿足大頂堆規則   } }

步驟二:調整指定結點形成大根堆

  • 建立childMax指針指向child最大值節點,初始值為2 * cur + 1,指向左節點
  • 當左節點存在時(左節點索引小于數組length),進入循環,遞歸調整所有節點位置,直到沒有左節點為止(cur指向一個葉結點為止),跳出循環,遍歷結束
  • 每次循環,先判斷右節點存在時,右節點是否大于左節點,是則改變childMax的指向
  • 然后判斷cur根節點是否大于childMax,
  • 大于的話,說明滿足大頂堆規律,不需要再調整,跳出循環,結束遍歷
  • 小于的話,說明不滿足大頂堆規律,交換根節點和子結點,
  • 因為交換了節點位置,子結點可能會不滿足大頂堆順序,所以還要判斷子結點然后,改變curchildMax指向子結點,繼續循環判斷。

冒泡排序、快速排序和堆排序的時間復雜度是多少

//從輸入節點處調整堆 function headAdjust(arr, cur, len) {   let intialCur = arr[cur]; //存放最初始的   let childMax = 2 * cur + 1; //指向子樹中較大的位置,初始值為左子樹的索引    //子樹存在(索引沒超過數組長度)而且子樹值大于根時,此時不符合大頂堆結構,進入循環,調整堆的結構   while (childMax < len) {     //判斷左右子樹大小,如果右子樹更大,而且右子樹存在,childMax指針指向右子樹     if (arr[childMax] < arr[childMax + 1] && childMax + 1 < len) childMax++;     //子樹值小于根節點,不需要調整,退出循環     if (arr[childMax] < arr[cur]) break;     //子樹值大于根節點,需要調整,先交換根節點和子節點     swap(arr, childMax, cur);     cur = childMax; //根節點指針指向子節點,檢查子節點是否滿足大頂堆規則     childMax = 2 * cur + 1; //子節點指針指向新的子節點   } }

步驟三:利用堆進行排序

  • 從后往前遍歷大頂堆(數組),交換堆頂元素a[0]和當前元素a[i]的位置,將最大值依次放入數組末尾。
  • 每交換一次,就要重新調整一下堆,從根節點開始,調整根節點~i-1個節點(數組長度為i),重新生成大頂堆
    冒泡排序、快速排序和堆排序的時間復雜度是多少
    冒泡排序、快速排序和堆排序的時間復雜度是多少
// 堆排序 function heapSort(arr) {   if (arr.length <= 1) return arr;   //構建大頂堆   buildHeap(arr);   //從后往前遍歷,   for (let i = arr.length - 1; i >= 0; i--) {     swap(arr, i, 0); //交換最后位置和第一個位置(堆頂最大值)的位置     headAdjust(arr, 0, i); //調整根節點~i-1個節點,重新生成大頂堆   }   return arr; }

完整代碼:

// 交換數組元素 function swap(a, i, j) {   [a[i], a[j]] = [a[j], a[i]]; } //從輸入節點處調整堆 function headAdjust(arr, cur, len) {   let intialCur = arr[cur]; //存放最初始的   let childMax = 2 * cur + 1; //指向子樹中較大的位置,初始值為左子樹的索引    //子樹存在(索引沒超過數組長度)而且子樹值大于根時,此時不符合大頂堆結構,進入循環,調整堆的結構   while (childMax < len) {     //判斷左右子樹大小,如果右子樹更大,而且右子樹存在,childMax指針指向右子樹     if (arr[childMax] < arr[childMax + 1] && childMax + 1 < len) childMax++;     //子樹值小于根節點,不需要調整,退出循環     if (arr[childMax] < arr[cur]) break;     //子樹值大于根節點,需要調整,先交換根節點和子節點     swap(arr, childMax, cur);     cur = childMax; //根節點指針指向子節點,檢查子節點是否滿足大頂堆規則     childMax = 2 * cur + 1; //子節點指針指向新的子節點   } } // 建立大頂堆 function buildHeap(arr) {   //從最后一個非葉子節點開始,向前遍歷,   for (let i = Math.floor(arr.length / 2 - 1); i >= 0; i--) {     headAdjust(arr, i, arr.length); //對每一個節點都調整堆,使其滿足大頂堆規則   } } // 堆排序 function heapSort(arr) {   if (arr.length <= 1) return arr;   //構建大頂堆   buildHeap(arr);   //從后往前遍歷,   for (let i = arr.length - 1; i >= 0; i--) {     swap(arr, i, 0); //交換最后位置和第一個位置(堆頂最大值)的位置     headAdjust(arr, 0, i); //調整根節點~i-1個節點,重新生成大頂堆   }   return arr; }

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产成人精品午夜福利在线播放| 翘臀后进呻吟喷水的少妇| 亚洲欧洲∨国产一区二区三区| 日韩人妻无码免费视频一区二区三区| 久久亚洲国产成人精品性色| 国内精品伊人久久久影视| 国产成人免费AV片在线观看| 菠萝菠萝蜜在线观看| 97超碰精品成人国产| 在线观看视频一区二区三区| 亚洲日韩国产AV无码无码精品| 性国产SE╳O色欲A片免费观看| 熟妇人妻久久中文字幕麻豆网| 人人爽亚洲AⅤ人人爽AV人人片| 欧美老妇疯狂XXXXBBBB| 免费无码观看的AV在线播放 | 亚洲国产成人无码网站大全| 天堂中文资源在线最新版下载| 日韩AV片无码一区二区三区不卡 | 四川骚妇无套内射舔了更爽| 亚洲AV永久无码精品国产精品| 我趁老师睡觉摸她奶脱她内裤| 色欲av蜜臀一区二区四区 | 西瓜在线看免费观看视频| 十八禁啪啪污污网站免费下载 | 人妻在厨房被侮辱高清版| 欧美疯狂3p群体交乱视频丨zu| 免费无码AV片在线观看中文| 日韩精品一二三区| 亚洲VA综合VA国产产VA中| 亚洲AV综合色区无码另类小说| 在厨房乱子伦对白| 成人国内精品视频在线观看| 成 人 黄 色 网站 69| 白嫩少妇激情无码| 差差漫画页面免费漫画欢迎你| 国产精品一区二区 尿失禁| 国产精品亚洲精品日韩已满| 久久久亚洲熟妇熟女ⅩXXXHD | 亚洲午夜久久久久妓女影院| 亚洲综合久久无码色噜噜赖水| 野花日本中文免费完整版4| 啊灬啊灬啊灬快灬高潮少妇软件 | 久草日B视频一二三区| 精品亚洲AⅤ在线观看| 清纯JK校花被啪啪AV免费| 日本适合十八岁以上的护肤品 | 国产成人AV男人的天堂| 久久精品亚洲一区二区三区浴池| 久久人人爽人人爽人人AV| 老头握住校花的双乳| 女性高爱潮免费有声视频网站| 青青草无码伊人久久| 亚洲AV日韩综合一区| 亚洲色欲啪啪久久WWW综合网| 又大又硬又粗再深一点视频| CHINESE国产AVVIDEOXXXX实拍| 必看无人区一码二码三码| 精品国产午夜福利在线观看 | 国产高清中文版HD中字| 国内揄拍国内精品人妻浪潮AV| 欧美顶级PPT免费模板网站| 色吊丝AV中文字幕| 性XXXX欧美老妇胖老太性多毛| 18禁强伦姧人妻又大又粗| 超碰97人人做人人爱可以下载| 精品人妻一区二区三区| 妺妺晚上扒我内裤吃我精子H | 欧洲S码亚洲M码精品一区| 日韩一中文字无码不卡| 无码中文AV波多野吉衣迅雷下载| 亚洲成av人片在线观看无码| 在线看片无码永久免费视频| 野花社区日本韩国免费观看| 国产风流老太婆大BBBHD视频| 免费精品无码AV片在线观看| 日韩人妻无码一区二区三区久久| 亚洲最大av在线| 国产美女自卫慰黄网站| 久久久久久A亚洲欧洲AV冫| 欧美日韩无套内射另类| 无码成人一区二区三区| 伊人久久久久熟女AV大片| 被多个男人调教奶头玩奶头| 国产乱妇乱子在线视频| 人人妻人人澡人人爽人人免费| 野草乱码一二三四区别在哪| 国产农村乱人伦精品视频| 久久伊人少妇熟女大香线蕉| 午夜精品久久久久久不卡| 伊人久久东京AV| 国产午夜亚洲精品理论片不卡| 老太奶性BBWBBWBBW| 亚洲AV无码一区二区一二区| 东京热无码人妻精品一区二区三区| 狠狠色噜噜狠狠狠888777米| 农村岳的肥白大腚| 无码人妻精一区二区三区| 玉蒲团之玉女心经| 精东传媒VS天美传媒在线| 欧美一级草B内射| 尤物精品国产第一福利网站| 狠狠亚洲婷婷综合色香五月| 无码人妻熟妇av又粗又大沈樵| 差差差很疼30分钟的视频| 欧美黑人一级爽快片婬片高清 | 亚洲熟女www一区二区三区| 国产亚洲婷婷香蕉久久精品 | 色偷偷AV男人的天堂京东热| XXX.日本学生妹.COM| 国产亚洲精品精品国产亚洲综合| 色欲香天天综合网站| 菠萝视频高清视频在线7| 欧美性婬爽www视频播放| 97SE亚洲国产综合自在线尤物| 鲁丝片一区二区三区免费| 边喂奶边中出的人妻| 欧美成人一区在线| 自慰无码一区二区三区| 国产人成亚洲综合无码AⅤ蜜桃| 日本动漫爆乳H动漫无遮挡| 亚洲一本之道高清乱码| 极品国产主播粉嫩在线| 日本无遮挡真人祼交视频| ZZTT155.CCM黑料| 女人无遮挡无内衣内裤网站| 98色精品视频在线| 精品无人区卡卡卡卡卡二卡三乱码 | 日本XXXX少妇高清HD| 凹凸在线无码免费视频| 人妻无码熟妇乱又伦精品| 被带到满是X玩具的房间挑调游戏| 人妻去按摩店被黑人按中出| 亚洲人成网线在线播放VA| 精品无码久久久久成人漫画| 亚洲日韩久久综合中文字幕| 久久精品国产亚洲AV麻豆| 无码人妻久久一区二区三区不卡| 国产成人精品免费久久久久| 我的妺妺H伦浴室无码视频| 国产精品丝袜无码不卡一区 | FREE嫩白18SEX性HD处| 精品无码久久久久久久久久| 亚洲另类无码专区丝袜| 国产精品久久久久JK制服| 日本粉色IPHONE| 成人国产精品一区二区免费看 | 哦┅┅快┅┅用力啊┅┅| JEAⅠOUSVUE成熟少归| 久久天天躁夜夜躁狠狠躁2022 | 美女又黄又免费的视频| 亚洲精品性爱av| 国产精品成人亚洲777| 日产精品码2码三码四码区| 丰满人妻熟妇乱偷人无码av | 久久久久精品一区中文字幕| 中文字幕色偷偷人妻久久| 久久变态刺激另类SM按摩| 性色欲情网站IWWW| 国产成人蜜桃AV无码永久免费| 性一交一乱一伦一色一情| 九九真实偷窥短视频| 2023国精产品一二二线免费| 老公和兄弟一前一后攻击 | 久别的草原在线看电视剧| 18禁裸男晨勃露J毛免费观看| 日本精品一线二线三线区别在哪里 | 成在人线AV无码免费高潮喷水| 欧美乱大交XXXXX在线观看| 成人欧美一区二区三区视频 | 成.人.大.片在线观看| 午夜亚洲乱码伦小说区69堂| 久久99青青精品免费观看| 99热精品国产三级在线| 免费久久99精品国产自在现| 宝贝儿感受到它对你的爱了吗小说| 天码AV无码一区二区三区四区| 豆国产93在线 | 亚洲| 亚洲AV成人AV天堂| 国产亚洲欧美日韩二三线| 亚洲最大的成人网站| 欧洲无人区天空码头IV在哪一本| 国产成人MV视频在线观看| 亚洲乱色熟女一区二区三区丝袜| 欧美成人片在线观看网站| 国产夫妻CCCXXX久久久| 用舌头去添高潮无码视频| 日韩欧美成人免费观看| 护士被强女千到高潮视频| 中文字幕人妻中文AV不卡专区| 色婷婷五月色综合AⅤ小说| 精品人伦一区二区三区蜜桃| JAPANESEHD春药2| 小SB几天没做又欠CH| 免费A级毛片无码A∨蜜芽| 国产丰滿老熟女多毛hD| 真人荫道口图片100张| 天无日天天射天天视| 国产亚洲精选美女久久久久| 中文字幕一区二区三区日韩精品|