模板 排序(一)

2022-05-16 16:45:48 字數 2984 閱讀 3846

在續講故事之前,我們先來聊一聊勇者打工的經歷。

* 停,在那之前還得科普一件事情。我們來講一下什麼是排序演算法的穩定性。

這個大概是最玄學的東西了,引用百科的話:

「假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。」

好的定義弄明白了,我們也大概知道不穩定有什麼壞處了——就是如果有相同的數字的話,不穩定的演算法就會將他們再排一遍,從而浪費時間。

然後呢,再補上一句百科的話,咱們開始講正文:

「需要注意的是,排序演算法是否為穩定的是由具體演算法決定的,不穩定的演算法在某種條件下可以變為穩定的演算法,而穩定的演算法在某種條件下也可以變為不穩定的演算法。」

*話說勇者在keke的工廠裡幹活,keke的工廠主要是負責工業(而且這個世界上只有這乙個工廠),所以來找他要鋼材的人特別多。keke按照訂單順序已經生產出了不同長短的鋼材,但是為了派貨方便,他決定將鋼材按照從大到小的順序排列。

「什麼鬼啊怎麼keke要解決問題就來找我呢?」勇者抱怨道。

「聽說解決問題的人可以獲得乙個int的gold……」路由器小聲說。

「那還等什麼啊快去幹啊!」

然而keke的廠子很多,每乙個廠子的特性不一樣。

——————————

(瞎編題時間)

keke的第乙個廠子沒什麼特別的,客人都是拖延症,不著急來拿鋼材,所以隨便搞,只要將鋼材從大到小排列就好了。

——————————

勇者雖然一根筋,但是最基礎的想法還是有的「只要列舉每次沒排序區間內的最大值將它放在前面不就好了?」

於是,他很快的寫好了一段魔法**,經路由器認定,這就是選擇排序。而且由於用到了兩層迴圈,故複雜度為o(n*n)

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=-99999999;

int main()

int maxn=inf,num=0,sum=1;

while(sum!=n)

for(int i=1;i<=n;i++)

return

0;}

*是的這裡路由器再插一嘴。

從前也誤導過其他童鞋,因為我曾經在最開始學排序的時候寫過這樣的***

#include

#include

#include

#include

#include

using

namespace

std;

int main()

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

for(int i=1;i<=n;i++)

return

0;}

*

我一直以為是氣泡排序…………特別尷尬,所以在此糾正我寫的其實是很low的選擇排序哦!(但是說實話,這**好背啊,而且如果換排序的話一般都會用快排的說很少用到o(n*n)的演算法……)」

*但是勇者得意的時候,路由器卻說「我查了一下,這個魔法貌似不穩定啊……」

勇者火冒三丈「啊?但是你看一下定義啊!它**不穩定了?」

確實啊,兩個魔法程式絲毫不違背定義,因此路由器經過深思熟慮之後,自我認為他們應該是穩定的。其實網上關於選擇排序到底是不是穩定的已經爭論很久了,在此路由器給出的看法是:看**實現是怎樣的,他的穩定性就是怎樣的。

「那既然有人說不穩定的話,你不如再寫乙個……」路由器小聲嘟囔道。

「好啊!有人挑戰我不是嗎,我再寫乙個!」

於是,勇者花了一天一夜的時間,又寫了乙個魔法,經過路由器認定,這個是氣泡排序o(n*n)也是顯而易見的。

#include

#include

#include

#include

#include

using

namespace

std;

int main()

bool ok=1;

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

}if(ok==1)break;

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

return

0;}

勇者自豪地說:「這個就是將兩個相鄰的數字進行比較,將大的往上浮,小的往下沉,這樣一遍一遍來,總是能將所有大的放在上面,小的沉在下面。」

「而且,這個魔法最高明之處(勇者又有點嘚瑟了),在於在已經排好序的情況下,用ok判斷是否已經排好序了,如果我們跑一趟卻發現沒有發生一次交換的話,那就說明已經排好序了,因此直接跳出迴圈就可。」

「誒嘿,想不到你還蠻聰明的嗎?不過我這裡還有乙個更好的優化」路由器神秘一笑,在某個魔法書裡找到了:

#include

#include

#include

#include

#include

using

namespace

std;

int main()

int top=1,bot=n;

bool ok=1;

while(top<=bot)

}if(ok==1)break;

for(int j=bot-1;j>=top;j--)

}if(ok==1)break;

top++;bot--;

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

return

0;}

模板 排序(一)

在續講故事之前,我們先來聊一聊勇者打工的經歷。停,在那之前還得科普一件事情。我們來講一下什麼是排序演算法的穩定性。這個大概是最玄學的東西了,引用百科的話 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri rj,且ri在rj之前,而在...

排序 快速排序 歸併排序模板 模板

正經人誰手寫這玩意?785.快速排序 本質 分治。是不穩定的排序演算法。時間複雜度 o n logn o nlogn o nlog n 空間複雜度 o l ogn o logn o logn 基於遞迴,用到棧空間 模板注意點 關於無限遞迴問題,大家動手模擬一遍樣例就能理解了。快排邊界問題很多,很煩 ...

1174 拓撲排序 一 模板題

題目鏈結 描述由於今天上課的老師講的特別無聊,小hi和小ho偷偷地聊了起來。小ho 小hi,你這學期有選什麼課麼?小hi 挺多的,比如 1,2還有 3。本來想選yyy2的,但是好像沒有先選過yyy1,不能選yyy2。小ho 先修課 是個麻煩的東西呢。小hi 沒錯呢。好多課程都有先修課程,每次選課之前...