优化排序
http://www.cnblogs.com/jack204/archive/2012/10/10/2717795.html
已知一個(gè)n個(gè)元素的數(shù)組,第i個(gè)元素在排序后的位置在[i-k,i+k]區(qū)間,k<<n .讓你設(shè)計(jì)一個(gè)算法對數(shù)組排序,要求時(shí)間復(fù)雜度最小
方法1:
建一個(gè)k的小堆,每次取最小,插入下一個(gè),維護(hù)這個(gè)堆n次,總共為O(nlogk)。
歸納法證明:
1 前k個(gè)取出最小的必然就是全部數(shù)組的最小的,因?yàn)榈谝粋€(gè)位置的在[0, k-1]之中的一個(gè)。
2 第j個(gè)取出來的數(shù)字,在數(shù)組就在j的位置上。因?yàn)楦鶕?jù)題意,第j個(gè)大的必然在(j-k, j+k)之間。他必然在[0, j+k-1]中第j個(gè)大的,前面已經(jīng)有[0, j-1]了,所以從堆中取出來就是第j個(gè)大的。即在數(shù)組的第j個(gè)位置上。
方法2:
a[i]在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a[i] <= a[i+2k],所以數(shù)組a里實(shí)際上有2k個(gè)各自有序的、交錯的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...}?
所以可以用2k-路歸并排序,用一個(gè)大小為2k的小頂堆輔助歸并,時(shí)間復(fù)雜度是O(n*log2k)
總結(jié)