Design an algorithm that rearranges all the numbers in a given table so that all negative values precede all nonnegative one. (The items need not be sorted completely, just separated between negative and nonnegative.) Your algorithm should use the minimum possible number of exchanges.
Knuth's solution:
Knuth suggests a modified radix exchange sort which compares the MSB (bit corresponding to sign )
Another way to do this is to write a specialized comparison routine which is passed to a sorting routine. The routine can be something like:
compare(a,b) if a<0 and b<0: return 0 // same if a>0 and b>0: return 0 // same return a>b // one -ve, one +ve
Other solution is to include counting sort technique.
The counting sort technique is implemented below in python and is stable.
import random N = 50 # generate an array of +ve and -ve numbers. array = random.sample( range(-N, N), N ) # counting techinque : 2 pass algorithm def counting_seperate(array): num_pos = 0 num_neg = 0 for i in array: if i<0: num_neg += 1 else: num_pos += 1 # destination array dest = [0] * len(array) #the final index of a +ve number, can simply be len of array num_pos += num_neg # Count from n-1 to 0 : stable i = len(array)-1 while i>=0: if array[i]< 0: dest[num_neg-1]=array[i] num_neg -= 1 # decrease the index else: dest[num_pos-1] = array[i] num_pos -= 1 # decrease the index i -= 1 print( "segregated array:", dest ) if __name__ == "__main__": print( "Original array: ", array ) counting_seperate(array)
No comments:
Post a Comment