幾種有趣的不常見排序演算法
我們常見的排序演算法有簡單選擇,冒泡,插入,兩路合併,希爾,堆,快速排序等等,下面介紹幾種不常見的排序演算法。
雞尾酒排序
雞尾酒排序是氣泡排序的微調演算法。
我們還記得,氣泡排序是每次遍歷整個序列,把較大的(我們這裡假設公升序排序)交換到後面。雞尾酒排序在交換到後面後,再逆向把最小的交換到前面。
為什麼取名叫雞尾酒呢?估計就像雞尾酒的上下攪動相似。
**:
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開始,第二次...