= Using Swap ver.1 = {{| Time Complexity: 2k* (k!)2/ 2k! Sigmai=1 to k ( i+1 ) ( k C i ) 2 approximation: O( n2 ) by metric n time n*n nlogn 1 3 1 0.0 2 8 4 1.38629436112 3 15 9 3.295836866 ..... 97 9603 9409 443.746964915 98 9800 9604 449.32681291 99 9999 9801 454.916865163 |}} {{{~php #!/usr/bin/python def getMedian(aList): if len(aList) < 3: return aList[0] n = len(aList)-1 k = n/2 maxIndex = aList.index(max(aList[0:k])) minIndex = aList.index(min(aList[k+1:n+1])) if aList[maxIndex] <= aList[k] <= aList[minIndex]: return aList[k] elif aList[maxIndex] <= aList[minIndex]: if aList[maxIndex] > aList[k]: swapList(aList, k, maxIndex) elif aList[minIndex] < aList[k]: swapList(aList, k, minIndex) else:# aList[maxIndex] > aList[minIndex]: swapList(aList, maxIndex, minIndex) return getMedian(aList) def swapList(aList, one, another): aList[one], aList[another] = aList[another], aList[one] def factorial(n): if n == 0: return 1 result = 1 for i in range(n): result *= i+1 return result def metric(k): sum = 0 for i in range(0,k+1): sum += (i+1)*(factorial(k)/factorial(i)/factorial(k-i))**2 return 2*k*(factorial(k)**2)*sum/factorial(2*k) if __name__ == '__main__': import sys, math if len(sys.argv) > 2 : if sys.argv[2] == "metric": for i in range(1, int(sys.argv[1])): print i, metric(i), i**2, i*math.log(i) elif sys.argv[2] == "median": test= range(int(sys.argv[1])) test.reverse() print getMedian(test) elif sys.argv[2] == "sort": test= range(int(sys.argv[1])) test.reverse() test.sort() print test[len(test)/2] }}} = Using Swap ver.2 = almost same. Sort is always faster than mine. {{{~php #!/usr/bin/python def getMedian(aList): if len(aList) < 3: return aList[start] n = len(aList)-1 k = n/2 for i in range(k): maxIndex = aList.index(max(aList[0:k-i])) minIndex = aList.index(min(aList[k+1+i:n+1])) swapList(aList, k-1-i, maxIndex) swapList(aList, k+1+i, minIndex) if aList[maxIndex] <= aList[k] <= aList[minIndex]: return aList[k] elif aList[maxIndex] <= aList[minIndex]: if aList[maxIndex] > aList[k]: swapList(aList, k, maxIndex) elif aList[minIndex] < aList[k]: swapList(aList, k, minIndex) else:# aList[maxIndex] > aList[minIndex]: swapList(aList, maxIndex, minIndex) def swapList(aList, one, another): aList[one], aList[another] = aList[another], aList[one] def factorial(n): if n == 0: return 1 result = 1 for i in range(n): result *= i+1 return result def metric(k): sum = 0 for i in range(0,k+1): sum += (i+1)*(factorial(k)/factorial(i)/factorial(k-i))**2 return 2*k*(factorial(k)**2)*sum/factorial(2*k) if __name__ == '__main__': import sys, math if len(sys.argv) > 2 : if sys.argv[2] == "metric": print "n\ttime\tn*n\tnlogn" for i in range(1, int(sys.argv[1])): print i,'\t', metric(i), '\t',i**2, '\t', i*math.log(i) elif sys.argv[2] == "median": test= range(int(sys.argv[1])) test.reverse() print getMedian(test) elif sys.argv[2] == "sort": test= range(int(sys.argv[1])) test.reverse() test.sort() print test[len(test)/2] }}}