給乙個為排序的陣列,你只能再改對該陣列做如下操作:flip(arr, i): 將陣列arr[0...i]進行逆置。如何對該陣列進行排序?
這個問題在程式設計之美一書也有提及:
星期五的晚上,一幫同事在希格瑪大廈附近的「硬碟酒吧」多喝了幾杯。程式設計師多喝了幾杯之後談什麼呢?自然是演算法問題。有個同事說:「我以前在餐館打工,顧客經常點非常多的烙餅。店裡的餅大小不一,我習慣在到達顧客飯桌前,把一摞餅按照大小次序擺好——小的在上面,大的在下面。由於我乙隻手托著盤子,只好用另乙隻手,一次抓住最上面的幾塊餅,把它們上下顛倒個個兒,反覆幾次之後,這摞烙餅就排好序了。我後來想,這實際上是個有趣的排序問題:假設有n塊大小不一的烙餅,那最少要翻幾次,才能達到最後大小有序的結果呢?」
你能否寫出乙個程式,對於n塊大小不一的烙餅,輸出最優化的翻餅過程呢?
這裡只給出直接的解法。演算法思想類似選擇排序,每次找到乙個最大的元素,對其進行兩次 flip操作,可將最大的放在最後面,讓後縮小陣列的範圍。因此最大需要 2*(n-1)次flip操作。
c++**實現如下:
01
#include
02
#include
03
04
/* 逆置陣列 arr[0..i] */
05
void
flip(
int
arr,
int
i)
06
16
}
17
18
/* 找出 arr[0..n-1] 內最大的元素的下標 */
19
int
findmax(
int
arr,
int
n)
20
27
28
int
pancakesort(
int
*arr,
int
n)
29
42
}
43
}
44
45
/* 列印陣列 */
46
void
printarray(
int
arr,
int
n)
47
51
52
int
main()
53
;
55
int
n =
sizeof
(arr)/
sizeof
(arr[0]);
56
57
pancakesort(arr, n);
58
59
puts
(
"sorted array "
);
60
printarray(arr, n);
61
62
return
0;
63
}
經典排序演算法
排序分為內部排序和外部排序,內部排序是指待排序的資料都是在記憶體中的,例如陣列 外部排序指待排序資源在記憶體外,例如對檔案的排序。此篇說的是內部排序。通俗地來說,內部排序就是將一堆資料按一定規則對它進行排序。排序又分為穩定排序和不穩定的排序,如果初始序列ai,ak有序 ai ak 排序後變成了ak,...
經典排序演算法
1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...
經典排序演算法
思想 相鄰元素兩兩比較大的往下沉,小的往上浮.具體點說就是兩相鄰元素相互比較,如果前面的元素比後面的大就換位置,否則繼續比較.舉個例子吧 將陣列arr 排序 廢話了那麼多,接下來是應該有 的對吧public static void bulletsort int arr 原理 用乙個索引位置上的元素,...