def separate_pos_neg(int_list): """ Put negative values before nonnegative ones and return the split index int_list: list of int, length >= 1 """ k = 0 j = len(int_list) # INV: int_list[0..k-1] < 0, int_list[0..j-1] >= 0 while k < j: if int_list[k] < 0: # kth element can stay where it is k = k + 1 elif int_list[j-1] >= 0: # jth element can stay where it is j = j - 1 else: # both need to move tmp = int_list[k] int_list[k] = int_list[j-1] int_list[j-1] = tmp k = k + 1 j = j - 1 return k list1 = [2,6,5,8,2,-5] print("The original list is "+str(list1)) k = separate_pos_neg(list1) print("The separated list is "+str(list1)+", with k = "+str(k)) list1 = [20,6,15,-8,2,-5] print("The original list is "+str(list1)) k = separate_pos_neg(list1) print("The separated list is "+str(list1)+", with k = "+str(k)) list1 = [20,-6,15,-8,0,-5,40,-9] print("The original list is "+str(list1)) k = separate_pos_neg(list1) print("The separated list is "+str(list1)+", with k = "+str(k))