成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
国产又大又粗又黄又爽白丝| 国产做无码视频在线观看浪潮| 国产丰满大屁股XXXX| 国产成人无码综合亚洲日韩| 国产精品成人影院久久久| 国语自产偷拍精品视频偷| 精品一区二区AV天堂| 蜜桃av中文字幕在线| 18禁动漫无码无遮挡免费看| 亚洲国产美女精品久久久久| 亚洲中文字幕精品久久久久久动漫| 伊人色综合久久天天五月婷| AV无码动漫一区二区三区精品| 成人毛片18女人毛片免费看快色| 国产波霸爆乳一区二区| 狠狠色综合7777久夜色撩人| 老女人性饥渴XXXXⅩHD另| 青青青国产精品一区二区| 四虎成人精品无码| 亚洲精品无码aⅴ中文字幕蜜桃 | 2022精品久久久久久中文字幕| OLDGRANNY日本老熟:妇| 国产成本人片免费AV| 娇妻在厨房被朋友玩得呻吟| 国产成人久久久精品二区三区| 韩国三级丰满少妇高潮| 麻豆国产成人AV在线播放| 人妻少妇精品无码系列| 午夜阳光精品一区二区三区| 一区二三区在线 | 中国| 保守人妻精油按摩被强出| 国产色诱视频在线观看| 两根硕大一起挤进小紧H共妻| 日本丰满人妻熟妇BBBBB③B| 亚洲AV毛片成人精品| 重口00Ⅹ变态另类| 公和我做好爽添厨房| 久久99精品国产99久久6尤物| 欧美性婬爽www视频播放| 午夜精品久久久久久久99热| 在线观看无码AV网址| 高潮又爽又黄又无遮挡动态图| 精品久久久久久成人AV| 精品人妻无码中字系列 | 久久久久成人精品无码中文字幕| 欧美与黑人午夜性猛交久久久| 香蕉大美女天天爱天天做| 中文字字幕乱码视频高清| 国产精品久免费的黄网站| 国产美熟女乱又伦AV果冻传媒| 老师你乖乖的可以让你少吃点苦头 | 精产国品一区别视频| 人妻一区二区三区高清AV专区| 人妻天天爽夜夜爽精品视频| 亚洲AV无码丰满尖叫高潮| 99精品热这里只有精品| 国产美女精品AⅤ在线| 内射骚妇高清AV电影| 欧美性爱群交视频| 亚洲国产精品一区二区美利坚| VIDEOSSEX变态狂另类| 极品少妇流白浆草莓视频| 日本丰满妇人成熟免费中文字幕| 亚洲日韩欧美成人一区二区三区| 草草浮力院禁止18进入| 久久久久精品无码一区二区三区 | 成在人线AV无码免费高潮喷水| 精品无人区卡一卡二卡三乱码| 日韩AV片无码一区二区不卡电影| 亚洲色大成网站WWW永久一区 | 看全色黄大色黄大片 视频| 无码粉嫩虎白一线天在线观看| 147VT最大但人文艺术| 黑人性狂欢在线播放| 日韩成人av网站| 中文字幕无码精品亚洲资源网久久 | 日韩AV高清在线观看| 中文精品久久久久鬼色| 国内精品卡一卡二卡三| 日韩无人区一卡2卡三卡4卡仙 | 男生把感叹号放进女生的括号 | 久久久久久久女国产乱让韩 | 337P日本大胆欧洲色噜噜| 狠狠婷婷色五月中文字幕| 少妇高潮喷潮久久久影院| 亚洲AV无码国产精品色午友在线| 超碰97人人射妻| 妺妺晚上扒我内裤吃我精子| 亚洲鲁丝片AV无码多人| 国产精品人人做人人爽| 日本特黄特色AAA大片免费| 中国人も日本人も汉字を| 波多野结衣守望人妻理论| 老熟妇高潮一区二区三区网| 亚洲AV中文AⅤ无码AV浪潮| 国产成人精品久久| 日本丰满岳乱妇在线观看| 中国少妇初尝黑人巨高清| 精品中文字幕久久久无码中文Av| 无码国产精品久久一区免费 | 老牛嫩草一二三产品区别| 亚洲AV无码一区二区三区DV| 乖别添了快放进来我想要| 人妻的渴望波多野结衣| 自拍偷在线精品自拍偷无码专区| 久久久WWW免费人成精品| 亚洲AV无码一区东京热久久| 国产女人高潮抽搐喷水视频| 少妇又粗又大人妻无码| 成 人 黄 色 网 站 视频 S色 | 99国产精品自在自在久久| 久久婷婷五月综合色和啪| 日日摸夜夜添夜夜添视频| H国产小视频福利免费视频| 国模少妇无码一区二区三区| 天天躁夜夜躁很很躁| 处破初破苞一区二区三区| 日本精品久久久久中文字幕| CHINESEXXXXHD麻豆| 欧美黑人又大又粗XXXX| 亚洲成A人片在线观看天堂无码不| 国产乱人伦AⅤ在线麻豆A| 偷欢人妻激情系列| 国产成人毛片在线视频| 少妇被粗大的猛烈的进出69影院| 吃瓜网最新官网地址| 搡BBBB槡BBBB| 短裙公车被直接进入| 色欲AV无码一区二区三区| 公么大龟弄得我好舒服第一| 他一边曰一边吃我奶小说免看| 公侵犯玩弄漂亮人妻优| 天码人妻一区二区三区| 国产精品久久久久久久久久久不卡 | 尤物一二三区在线内射美女 | 色久综合网精品一区二区| 成人无码区免费AⅤ片黄瓜视频| 日韩一区二区三区四区| 饭桌上故意张开腿让公在线观看| 上课我穿超短裙被同桌摸出水| 高潮喷奶水在线播放视频| 无码AⅤ精品一区二区三区| 国产人与ZOXXXX另类| 波多野结衣AV高清中文字幕| 无遮挡呻吟娇喘视频免费播放| 国产精品毛片无遮挡| 亚欧乱色熟女一区二区三区| 亚洲色婷婷综合开心网| 久久九九久精品国产| 中日AV高清字幕版在线观看| 男人J桶进女人P无遮挡的图片| 99在线精品一区二区三区| 强奷秘书吸乳免费观看| 成在线人AV免费无码高潮喷水| 天堂在/线资源中文在线| 国产在线无码一区二区三区 | 理论片午午伦夜理片影院| 99精品视频在线观看婷婷| 日本高清中文字幕在线观穿线视频| 厨房掀起裙子从后面进去视频| 无码AV免费一区二区三区| 精品国产_亚洲人成在线| 永久免费的啪啪网站免费观看浪潮| 女人大胆张开荫道口∞ | 日韩中文人妻无码不卡| 国产精品无码成人午夜电影| 亚洲欧美国产精品专区久久| 某处紧密的结合在一起| 敌伦交换第21部分正文内容| 欧美日韩国产精品自在自线| 成人做受120视频试看| 学生妹亚洲一区二区| 久久久久人妻一区精品果冻| 亚洲成AⅤ人片久青草影院 | 日韩人妻无码一区二区三区综合| 国产精品国产三级在线专区| 亚洲国产天堂久久综合226| 男吃奶玩乳尖高潮视频午夜| 妇女性内射冈站HDWWW000| 亚洲成AV人无码综合在线| 男人J桶进女人P无遮挡在线观看 | 亚欧乱色国产精品免费九库| 久久人人做人人爽人人AV| 波多野结衣无内裤护士 | 国产真人无遮挡作爱免费视频| 越南女子杂交内射BBWXZ| 日本MACBOOKPRO高清| 国产亚洲成AⅤ人片在线观看蜜桃| 一炕四女被窝交换啪啪| 日韩精品一区二区视频| 精品久久久久国产免费 | 国产超薄肉色丝袜视频| 无码人妻少妇久久中文字幕| 浪货趴办公桌~H揉秘书电影 | 日本丰满老妇BBB| 国语自产少妇精品视频蜜桃| 777国产偷窥盗摄精品品在线| 无码专区永久免费AV网站| 免费少妇A级毛片| 国产精品无码久久久久|