天天看點

正負數排序

#!/usr/bin/python
#coding=utf8
'''
time 2015.05.16
refer http://blog.csdn.net/bestwolf1983/article/details/9157621
'''

def sort_positive_negative(data_list):
'''
@brief:将數組裡的負數排在數組的前面,正數排在數組的後面,但不改變原先負數和正數的排列順序;時間複雜度為o(n^2),空間複雜度為o(1)
@param data_list:待排序的數組
@return:None
'''
	print(data_list)
	length = len(data_list)
	head = 0 #自然數開始的下标
	while data_list[head] <= 0: #找到第一個自然數
		head += 1
	tail = head + 1 #已經有序的自然數後面的負數的下标
	while head < length:
		while data_list[tail] >= 0: #找到有序自然數後面的第一個負數
			if tail == length - 1:
				break
			tail += 1
		if data_list[tail] >= 0: #如果找不到負數,那麼數組已經有序
			break
		temp = data_list[tail] #儲存負數
		for i in xrange(tail, head, -1): #循環後移已有序的自然數,為負數騰出空間
			data_list[i] = data_list[i-1]
		data_list[head] = temp #将負數填充到最終的位置,一次循環會确定一個負數的最終位置
		head += 1
		print(data_list)

'''
@brief:将數組裡的負數排在數組的前面,正數排在數組的後面,但不改變原先負數和正數的排列順序;時間複雜度為o(n),空間複雜度為o(1)
@param data_list:待排序的數組
@return:None
'''
def sort_positive_negative1(data_list):
        i = 0
        j = len(data_list)-1
        while(i < j):
            while i < j:
                if data_list[i] >= 0:
                    break
                else:
                    i = i + 1
            while i < j:
                if data_list[j] <= 0:
                    break
                else:
                    j = j -1
            r = data_list[i]
            data_list[i] = data[j]
            data_list[j] = r
        print data_list

if __name__ == "__main__":
	data_list = [-5, 2, -3, 4, -8, 0, -9, 1, 3, -10, 22, 33, 44, 55, -10]
	sort_positive_negative(data_list)