[請益] 陣列數值排序

看板PHP作者 (喔椰~~)時間10年前 (2014/04/23 18:50), 編輯推噓0(0053)
留言53則, 6人參與, 最新討論串1/1
想請問各位大大 今天如果我有一維陣列的數值為2,2,3,3,4,4,5,5,6,7,8,9,10,11,12 要怎麼把它自訂排序變成2,3,4,5,2,3,4,5,6,7,8,9,10,11,12 ? 或者是2,3,4,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12 要怎麼把它變成2,3,4,5,6,7,8,9,10,11,12,6,7,8,9,10,11,12 ? 跪求各位大大解惑 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.86.131 ※ 文章網址: http://www.ptt.cc/bbs/PHP/M.1398250217.A.6EF.html

04/23 20:55, , 1F

04/23 20:56, , 2F
我是按照你的需求做,不是通用
04/23 20:56, 2F

04/23 22:03, , 3F
多謝大大指點,但是我跑了你的程式,發現第一個case
04/23 22:03, 3F

04/23 22:04, , 4F
會變成2~12印兩次,我的意思是只有重複兩次的數值
04/23 22:04, 4F

04/23 22:04, , 5F
需要排,也就是總長度其實是不變的
04/23 22:04, 5F

04/23 23:10, , 6F
一樓看得懂規則喔 翻譯一下
04/23 23:10, 6F

04/23 23:22, , 7F
找差一的塞,不然就找最小的
04/23 23:22, 7F

04/23 23:43, , 8F

04/24 00:03, , 9F
咦.. 我測試時正確,我再看看 不過這個條件很奇怪就是..
04/24 00:03, 9F

04/24 00:18, , 10F
上面貼的是假設沒有負數的狀況,所以省略了一些判斷
04/24 00:18, 10F

04/24 00:19, , 11F
樓主給的兩個數列排序之後的結果好像邏輯不一樣
04/24 00:19, 11F

04/24 00:19, , 12F
推文給的都是最小跑到最大不重複然後再重新來過
04/24 00:19, 12F

04/24 00:20, , 13F
可是樓主第一個數列好像又不是這麼一回事,題目有錯嗎?
04/24 00:20, 13F

04/24 00:22, , 14F
希望樓主把題目講清楚..不然根本沒人知道規則是什麼...
04/24 00:22, 14F

04/24 00:22, , 15F
懂了,是後方優先
04/24 00:22, 15F

04/24 00:33, , 16F
可是那只是第一個的條件,這兩個條件根本不一樣
04/24 00:33, 16F

04/24 00:33, , 17F
摟主要解釋 1.重複的數列是要排在前面還是後面?
04/24 00:33, 17F

04/24 00:33, , 18F
2.數列一開始就會是排序好得嗎?還是有可能會打亂?
04/24 00:33, 18F

04/24 00:34, , 19F
根據樓主的回答會直接改變這隻程式的複雜度
04/24 00:34, 19F

04/24 00:36, , 20F
是自動從有切齊的那頭開始跑?(1的min跟2的max)
04/24 00:36, 20F

04/24 00:41, , 21F
樓主要的是被排序的連續數列,可是這些數列的排序是?
04/24 00:41, 21F

04/24 00:42, , 22F
以 頭/尾為基準 遞增/遞減排序 ?
04/24 00:42, 22F

04/24 01:32, , 23F

04/24 01:32, , 24F
修正 應該兩個都對了 ... 少加了一個判斷
04/24 01:32, 24F

04/24 01:37, , 25F
http://pastebin.com/0XAHzAMf 換一個空間貼比較好看
04/24 01:37, 25F

04/24 01:39, , 26F
我的假設是,假如第一個遇到就重複,就先把重複貼完(直到
04/24 01:39, 26F

04/24 01:39, , 27F
不重複),貼完後再從頭開始 foreach 一次,這是第一條
04/24 01:39, 27F

04/24 01:40, , 28F
第二個規則是,假設初始不重複,則一直跑,直到遇到重複
04/24 01:40, 28F

04/24 01:40, , 29F
接著將重複的數字記錄,同時先將數列跑完一次,等結束後
04/24 01:40, 29F

04/24 01:41, , 30F
再將重複的那些數字loop跑完,這樣來讓兩個條件同時達成
04/24 01:41, 30F

04/24 01:41, , 31F
但是這條件限制很大,就是中間假設不連續就會錯誤
04/24 01:41, 31F

04/24 01:43, , 32F
http://ideone.com/QEjDQk 頭尾各sort一次
04/24 01:43, 32F

04/24 01:46, , 33F
@kerash,用 http://ideone.com/ 貼還可以看編譯結果
04/24 01:46, 33F

04/24 01:52, , 34F
再貼下去我好像會貼太多了 :[
04/24 01:52, 34F

04/24 01:56, , 35F
因為樓主沒說清楚,我就以他給的例子所看到的部份來假設
04/24 01:56, 35F

04/24 01:58, , 36F
1.只會重複1次 2.只會重複開頭或結尾其中一種
04/24 01:58, 36F

04/24 02:02, , 37F
http://ideone.com/QtIFOC 所以我的思考方式就是直接把
04/24 02:02, 37F

04/24 02:03, , 38F
重複的地方拿出來,再來決定要黏在哪
04/24 02:03, 38F

04/24 02:05, , 39F
我的解法也可以處理中間重複的情況
04/24 02:05, 39F

04/24 08:33, , 40F
開一個陣列,內容是2,3,4,...,12
04/24 08:33, 40F

04/24 08:33, , 41F
新陣列進來排序就照「模板陣列」的內容挑出來排
04/24 08:33, 41F

04/24 08:34, , 42F
超簡單的,有沒有規則都合適,愛怎麼排就怎麼排,壓比
04/24 08:34, 42F

04/24 12:43, , 43F
對不起我沒說清楚規則,簡單來說就是
04/24 12:43, 43F

04/24 12:44, , 44F
有兩對的一定是連號的數字
04/24 12:44, 44F

04/24 12:45, , 45F
抓到有兩對的那組數字,就在那段區間輸出兩次數字排
04/24 12:45, 45F

04/24 12:45, , 46F
序就是了
04/24 12:45, 46F

04/24 12:47, , 47F
而且這個數列一定是遞增排序好的
04/24 12:47, 47F

04/24 12:56, , 48F
如果有三對重複的就會貼三次這樣
04/24 12:56, 48F

04/24 12:58, , 49F
跑完k大的程式如果有三組重複的數字好像只會輸出兩次?
04/24 12:58, 49F

04/24 13:08, , 50F
跑完m大的我發現可以ㄟ
04/24 13:08, 50F

04/24 13:16, , 51F
感謝各位大大解惑QQ
04/24 13:16, 51F

04/24 20:36, , 52F
因為你的條件太少,我只針對重複數只有一次的狀況去跑
04/24 20:36, 52F

04/24 22:07, , 53F
sorry k大 我條件應該下清楚些!
04/24 22:07, 53F
文章代碼(AID): #1JLvhfRl (PHP)