排序演算法(2)

2022-07-15 09:24:07 字數 1125 閱讀 2408

時間複雜度為o(n*logn)的三個演算法,歸併排序、快速排序、堆排序、希爾排序

歸併排序:

將陣列分為若干個步長為1的區間,把兩個相鄰的區間合併,成為乙個步長為2的有序區間  ,然後把兩個相鄰的步長為2的區間合併,成為乙個步長為4的有序區間,以此類推,直到最後所有都有序

新建乙個陣列,將需要合併的區間a、區間b從第乙個開始比較,如果a中當前指向的數和b指向的比較,更小,在新建的陣列放入a中指向的數,a中的指標向前移一位,陣列中指標向前移一位。若b中指向的數小,同理。直到a或b的全部數都放進新建陣列中,將另乙個陣列剩下的值接在後面。新陣列為合併後的新的有序區間。遞迴呼叫分解方法,分解後呼叫合併方法。

快速排序:

將陣列最左、中間、最右的數大小排序,最小的放在最左,第二大的放在中間,最大的放在最右

將中間的數放在陣列倒數第二個位置,以這個數作為標準排序。設定指標i、j,判斷 i 指向的數是否比倒數第二個數大,不是則 i 向右移動一位 ,直到找到比倒數第二個數大或者 i == j 時;i 停下後,判斷 j 指向的數是否比倒數第二個數小,如果是則和 i 指向的數交換,否則向左移動一位繼續尋找,找到則交換。i 最終停下的位置和倒數第二個數交換。此時陣列分為比排序標準的數小和比排序標準數大兩部分。在這兩部分中再分別進行剛才的快速排序。

堆排序:

大頂堆 的定義:array[ i ] >= array[2i + 1] && array[ i ] >= array[2i +2]

先將傳入的長度為 n 的陣列整理成乙個大頂堆,將堆頂的元素即array[ 0 ] 和 array[ n - 1 ]上的數交換,移出堆;調整長度為 n -1 的大頂堆(在第一次已經整理好的基礎上,只需要將位置0上的數找到合適的位置放好即可,不需要整理所有數的位置),然後再次將堆頂和隊尾元素互換。直到堆的長度為 1 時,陣列整理完畢。

整理出大頂堆的過程:從最後乙個非葉子節點(位置在array.length/2 -1)開始,從右到左,從下到上調整節點位置(節點、節點的左孩子和右孩子三個數進行比較,最大的和節點進行交換)。

排序 排序演算法2

思想 堆,堆頂元素 即第乙個元素 必為最小項 小頂堆 公升序序列 或者最大項 大頂堆 降序序列 若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於 或不小於 其子女的值,根結點 堆頂元素 的值是最小 或最大 的。雖然說是一棵完全二叉樹,但不是說就得根據這些資料還需要重新建立資...

排序演算法 2

歸併排序 merge sort 依舊先上源 include include void merge int sourcearr,int temparr,int startindex,int midindex,int endindex while i midindex 1 temparr k sourc...

排序演算法2

這是 漫談經典排序演算法系列 第二篇,解析了各種插入排序演算法 主要包括 直接插入排序 折半插入排序 表插入排序 希爾插入排序。每一種演算法的開頭都敘述了引出該演算法的原因,然後給出 最後分析演算法效率及和其他插入排序相比,優劣在 各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排...