iOS 排序演算法總結

2021-07-10 01:56:23 字數 2129 閱讀 7129

查考**:

二叉樹借鑑上面乙個位址, 把常用的一些排序演算法總結歸納一下, 便於大家和自己的學習

一、插入排序

1、 直接插入排序

直接插入排序基本思想

1、基本思想

假設待排序的記錄存放在陣列r[

1..n]中。初始時,r[

1]自成1個有序區,無序區為r[

2..n]。從i=

2起直至i=n為止,依次將r[i]插入當前的有序區r[

1..i-

1]中,生成含n個記錄的有序區。

2、第i-

1趟直接插入排序:

通常將乙個記錄r[i](i=

2,3,…,n-

1)插入到當前的有序區,使得插入後仍保證該區間裡的記錄是按關鍵字有序的操作稱第i-

1趟直接插入排序。

排序過程的某一中間時刻,r被劃分成兩個子區間r[

1..i-

1](已排好序的有序區)和r[i..n](當前未排序的部分,可稱無序區)。

直接插入排序的基本操作是將當前無序區的第1個記錄r[i]插人到有序區r[

1..i-

1]中適當的位置上,使r[

1..i]變為新的有序區。因為這種方法每次使有序區增加1個記錄,通常稱增量法。

插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較

1.演算法描述

void lnsertsort(seqlist r)

while(r[0].key//

當r[i].key≥r[j].key

時終止

r[j+1]=r[0];//r[i]

插入到正確的位置上

}//endif }

} 2、希爾(shell)排序

基本思想:

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序;然後,取第二個增量d2重複上述的分組和排序,直至所取的增量dt=

1(dt,即所有記錄放在同一組中進行直接插入排序為止。

該方法實質上是一種分組插入方法。

shell排序的演算法實現

1.不設監視哨的演算法描述

void shellpass(seqlist r,

int d)

while(j>0&&r[0].key;

r[j+d]=r[0];

//插入

r[i]

到正確的位置上

} //endif

} //shellpass

void  shellsort(seqlist r)

while(increment>1)

} //shellsort

注意:當增量d=

1時,shellpass和insertsort基本一致,只是由於沒有哨兵而在內迴圈中增加了乙個迴圈判定條件"j>0",以防下標越界。

二、交換排序

1、氣泡排序

具體演算法

void bubblesort(seqlist r)

if(!exchange) //

本趟排序未發生交換,提前終止演算法

return;

} //endfor(

外迴圈)

} //bubblesort

2、快速排序

快速排序是對氣泡排序的一種本質改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃瞄,就能確保以某個數為基準點的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。

顯然快速排序可以用遞迴實現,當然也可以用棧化解遞迴實現。

快速排序是不穩定的。最理想情況演算法時間複雜度o(nlog2n),最壞o(n2)

main()

quick_sort(int l,int first,int end)

}quick(int first,int end,int l)

l[left]=key;

return left;

}

iOS演算法總結 堆排序

堆 排序 很明顯,我們可以發現它們都是 二叉樹,如果觀察仔細些,還能看出它們都是 完全二叉樹。上圖中根節點是所有元素中最大的,右圖的根節點是所有元素中最小的。再仔細看看,發現左圖每個節點都比它的左右孩子要大,右圖每個節點都比它的左右孩子要小。這就是我們要講的堆結構。堆是具有下列性質的完全二叉樹 每個...

ios排序演算法

void bubblingaction 氣泡排序 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一...

iOS 演算法總結

1.不用中間變數,用兩種方法交換a 和 b的值 func arithmetic1 func swap11 a inout int,b inout int func swap22 a inout int,b inout int func swap33 a inout int,b inout int 2...