關於烙餅排序問題的演算法與Java實現

2021-08-03 18:47:48 字數 1557 閱讀 5735

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

在書裡給我們講解了尋找最優解的方案。

但是,在我看到這個問題的時候,我是在想用什麼排序方法能將烙餅排序問題解決。

假設盤裡有9張餅,大小以次是,我要將它以次擺好,最後擺成,且我只能從前面反轉餅來排序。

從頭第一次遍歷,發現1,2是有序的並且是從小到大。

然後找到1,2,之後3的位置,發現如果直接將1,2反轉到3之前的位置,那麼將會是2,1,3,很明顯這是徒勞的,所以先將1,2反置成2,1,這是第一次翻轉,讓有序數中大的數在外前面。

----->

然後找到比最外層大一點數,3,翻轉3之前的數。第二次翻轉。

------>

這樣再次遍歷,發現前面是5,6,7並且是有序的,將其翻轉,第三次翻轉,讓大的數在前面。

------>

然後我們再找比最外大一點的數,8,翻轉8之前的數。第四次翻轉。

------->

這樣再次遍歷發現前面的3,2,1並且是有序的,而且大的數在外面,就剩下以次翻轉,直接將比3大一點的4之前的數翻轉。第五次翻轉

------>

ok,這次遍歷,發現可以從頭順到尾,沒毛病,排序結束排序成功

public class cakesorting 

public int setcakearray();

return cakearray;

} public void ergodic(int cakearray)

break;

}}else

//開始找比最外層大一點的數值的位置

bigposition = findbigposition(cakearray[0], cakearray);

//找到位置後,開始反轉

cakearray = turnarray(bigposition, cakearray);

i = 0;

}} }

private int findbigposition(int n,int cakearray)elseelse

}j = i;//記錄i的位置

}else if(n - cakearray[i] == 0)

} return j ;

} private int turnarray(int bigposition ,int cakearray)else

for(int i = 0; i < length/2 ; i++)

outresult(cakearray);

return cakearray;

} private void outresult(int cakearray)

system.out.println();

}}

一摞烙餅的排序問題 讀書筆記(2)

問題描述 一摞大小不一的餅,由於乙隻手托著盤子,只好用另乙隻手,一次抓住最上面的幾塊餅,把它們上下顛倒個,反覆幾次使烙餅安裝由小到大排好序。假設有n塊大小不一的餅,最少需要翻幾次使烙餅排好序。分析與解法 首先,經過兩次翻轉可以把最大的烙餅翻轉到最下面,因此,最多需要把上面的n 1個烙餅依次翻轉兩次。...

關於快速排序演算法的問題記錄

include void swap int a,int b void print int a,int n printf n void maopao int a,int n void choose int a,int n swap a i,a min void fast int a,int n fas...

關於排序的問題

下午幫乙個妹子去處理乙個表,有資料三萬多條,要實現先把大類排序,然後再把大類中的小類排序。不同的大類裡裡面可能有相同大小的小類。舉個例子,乙個地區裡面,有不同的學校 號碼不同 先把學校號碼進行排序,然後再把每個學校的的學生學習名次進行排序。注意,這裡我把每一行前面三項省略了。如下 07537666x...