經典演算法 烙餅排序

2021-07-14 19:26:31 字數 2320 閱讀 5679

給乙個為排序的陣列,你只能再改對該陣列做如下操作:flip(arr, i): 將陣列arr[0...i]進行逆置。如何對該陣列進行排序?

這個問題在程式設計之美一書也有提及:

星期五的晚上,一幫同事在希格瑪大廈附近的「硬碟酒吧」多喝了幾杯。程式設計師多喝了幾杯之後談什麼呢?自然是演算法問題。有個同事說:「我以前在餐館打工,顧客經常點非常多的烙餅。店裡的餅大小不一,我習慣在到達顧客飯桌前,把一摞餅按照大小次序擺好——小的在上面,大的在下面。由於我乙隻手托著盤子,只好用另乙隻手,一次抓住最上面的幾塊餅,把它們上下顛倒個個兒,反覆幾次之後,這摞烙餅就排好序了。我後來想,這實際上是個有趣的排序問題:假設有n塊大小不一的烙餅,那最少要翻幾次,才能達到最後大小有序的結果呢?」

你能否寫出乙個程式,對於n塊大小不一的烙餅,輸出最優化的翻餅過程呢?

這裡只給出直接的解法。演算法思想類似選擇排序,每次找到乙個最大的元素,對其進行兩次 flip操作,可將最大的放在最後面,讓後縮小陣列的範圍。因此最大需要 2*(n-1)次flip操作。

c++**實現如下:

01#include

02#include

03

04/* 逆置陣列 arr[0..i] */

05voidflip(intarr,inti)

06

16}

17

18/* 找出 arr[0..n-1] 內最大的元素的下標 */

19intfindmax(intarr,intn)

20

27

28intpancakesort(int*arr,intn)

29

42}

43}

44

45/* 列印陣列 */

46voidprintarray(intarr,intn)

47

51

52intmain()

53;

55intn =sizeof(arr)/sizeof(arr[0]);

56

57pancakesort(arr, n);

58

59puts("sorted array ");

60printarray(arr, n);

61

62return0;

63}

經典排序演算法

排序分為內部排序和外部排序,內部排序是指待排序的資料都是在記憶體中的,例如陣列 外部排序指待排序資源在記憶體外,例如對檔案的排序。此篇說的是內部排序。通俗地來說,內部排序就是將一堆資料按一定規則對它進行排序。排序又分為穩定排序和不穩定的排序,如果初始序列ai,ak有序 ai ak 排序後變成了ak,...

經典排序演算法

1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...

經典排序演算法

思想 相鄰元素兩兩比較大的往下沉,小的往上浮.具體點說就是兩相鄰元素相互比較,如果前面的元素比後面的大就換位置,否則繼續比較.舉個例子吧 將陣列arr 排序 廢話了那麼多,接下來是應該有 的對吧public static void bulletsort int arr 原理 用乙個索引位置上的元素,...