幾種有趣的不常見排序

2021-06-18 13:44:26 字數 3003 閱讀 8813

幾種有趣的不常見排序演算法

我們常見的排序演算法有簡單選擇,冒泡,插入,兩路合併,希爾,堆,快速排序等等,下面介紹幾種不常見的排序演算法。

雞尾酒排序

雞尾酒排序是氣泡排序的微調演算法。

我們還記得,氣泡排序是每次遍歷整個序列,把較大的(我們這裡假設公升序排序)交換到後面。雞尾酒排序在交換到後面後,再逆向把最小的交換到前面。

為什麼取名叫雞尾酒呢?估計就像雞尾酒的上下攪動相似。

**:

void cocktail_sort(int *a,int n)

}top = top - 1;

for (int i = top; i > bottom; i = i - 1)

}bottom = bottom + 1;}}

時間複雜度o(n^2)

鴿巢排序

一群飛出去瞎逛的鴿子,全都飛回來原來的巢穴了,它們按照自己的編號蹲到自己的巢穴中,就變得有序了,這就是鴿巢排序。如下圖:

接著,我們用陣列a表示鴿子,陣列b表示巢穴,即hash表,在b中記數後,放回到a中。**如下:

void pigeonholesort(int *array,int n)

for (int i = 0; i

鴿巢排序方法很直觀,不過我們也看出來它有過多的侷限性,多餘的空間,不確定的最大值等等。時間複雜度為o(n+n);

奇偶排序

又稱奇偶換位排序,類似氣泡排序的思想,先是奇-偶換位,然後偶-奇換位,最後沒有換位操作是,判斷排序成功。如下圖:

**如下:

void batcher(int *a,int n)

}for (int i = 0; i < n-1; i += 2)}}

}

時間複雜度o(n^2);

臭皮匠排序

看到這個名字和演算法的時候,我也驚呆了。具體乙個看,還真像他的名字那樣,看著有意思,實際也就是臭皮匠而已。有時候效率還不及氣泡排序。

臭皮匠排序是乙個遞迴排序,每個序列判斷交換頭尾兩個後,分為三個子串行,也就是三個臭皮匠。

如果最後乙個值小於第乙個值,則交換它們

如果當前子集元素數量大於等於3:

使用臭皮匠排序前2/3的元素

使用臭皮匠排序後2/3的元素

再次使用臭皮匠排序前2/3的元素

}時間複雜度為:o(nlog 3 /log1.5)

梳排序

梳排序也類似氣泡排序,只不過他的間隔不是1,而是乙個不斷遞減的值。gap初始為整個佇列的大小,接著按照乙個遞減引數減少至1,。當gap==1是,就退化為氣泡排序。

有人證明,gap的遞減因子設定為1.247330950103979時,能達到最好的效果。

如下圖:

交換比較的間隔不斷縮小至1,變為氣泡排序。

這樣的好處是用較大的間隔,把原先影響氣泡排序效率的最後的幾個「烏龜」(如果是公升序排序,就是在後面的幾個小值)快速地移動到較前的地方,用以提高冒泡的效率。

**:

void combsort(int *arr, int size)

++i;}}

}

時間複雜度:o(n^2/2^p)

圖書館排序

圖書館排序是一種改進的插入排序,是一種以空間換時間的方法。

回憶一下插入排序,由前往後尋找插入的位置,接著把位置之後的所有元素後移乙個位置。圖書館排序就是來處理第二步,後移乙個位置。

圖書館管理員在放書的時候,一本本書放到書架上,如果每放一本都緊貼著,那麼後來要在中間插入的時候,就要費工夫把書分開,騰出插入的空間了。如果在放書的時候,就預留了空間,那麼就可以少花這些工夫了。

具體的間隔設定是多少,沒有搜到相關資料。

圖書館君的編碼:

首先我們新建乙個陣列,把每個元素以某個間隔存放,然後執行直接插入。插入時,選擇插入位置前某個空餘空間;如果沒有空餘空間,按照原來的直接插入的方法,全部往後移;最後去掉空格,整理排序結果。

這裡我們取gap=4,用乙個額外的陣列b來記錄空餘空間,**如下:

void libsort(int *a,int *b,int n,int l)

else

a[j]=temp;

b[j]=1;

break;}}

}}}}int main()

libsort(a,b,k-gap+1,k);

for (int i=0;i<=k;i++)

{if (b[i])

cout<

bogo排序

不知道誰想出來的,貌似非常不實用,時間複雜度高達o(n*n!)。

bogo排序步驟:

1.      把佇列隨機打亂

2.      佇列有序?ok;否則,重新執行第1步。

如果我理解沒有錯,這個演算法能排序好的概率是不是跟中彩票一樣?

陣列的幾種不常見用法

元素除了可以新增刪除之外,還可以交換它們所在的位置,比如我要用第0個元素和第2個元素交換,那麼我們通過乙個簡單的方法就可以實現了.涉及的方法 exchangeobjectatindex 需要交換位置的元素位置,比如例子裡寫的是0,那麼就是 one 這個元素需要換到別的地方去.withobjectat...

幾種不常用的排序演算法

基於比較大排序演算法至少需要o n lgn 的複雜度。對於一些特殊的輸入我們有一些特殊的演算法,有可能得到複雜度為o n 的演算法。本文簡要描述其中的幾種 count排序,基數排序和桶排序。count排序的假設是被排序的字段在乙個有限的範圍內,比如對1000人按照年齡排序。count排序需要兩個額外...

常見的幾種排序

常見的排序 選擇排序 直接選擇排序 堆排序 交換排序 氣泡排序 直接交換排序 插入排序 直接插入排序 shell排序 折半插入排序 歸併排序 基數排序 1.選擇排序 1.1直接選擇排序 選擇排序 直接選擇排序 每迴圈一次取出其中最大或者最小的乙個 插入到靠前或者靠後的位置 當然第一次從0開始,第二次...