Python算法学习day3:快速排序(二)

排序

(1) 取出一个数列中唯一一个奇数出现的数字

例如:
li = [1,2,1,3,2,1,1,2,2,3,3]
唯一一个奇数出现的数字为3

代码详细:

li = [1,2,1,3,2,1,1,2,2,3,3]
num = 0
for i in li:
	num = num ^ i #这里运用了一个异或符号的小技巧 当然只能在数列中只存在唯一一个数字才可使用
print(num)

(2) 快速排序

def quick_sort(li, left, right):
	if left < right:
		mid = partition(li, left, right)
		quick_sort(li, left, mid - 1)
		quick_sort(li, mid + 1, right)
def partition(li, left, right):
	tmp = li[left]
	while left < right:
		while left < right and li[right] >= tmp:
			right -= 1
		li[left] = li[right]
		while left < right and li[left] <= tmp:
			left += 1
		li[right] = li[left]
	li[left] = tmp
	return left

时间复杂度为O(nlogn)

如果出现最坏情况如[7,6,5,4,3,2,1]
优化代码:

def quick_sort(li, left, right):
	if left < right:
		mid = random_partition(li, left, right)
		quick_sort(li, left, mid - 1)
		quick_sort(li, mid + 1, right)
def partition(li, left, right):
	tmp = li[left]
	while left < right:
		while left < right and li[right] >= tmp:
			right -= 1
		li[left] = li[right]
		while left < right and li[left] <= tmp:
			left += 1
		li[right] = li[left]
	li[left] = tmp
	return left
def random_partition(li, left, right):
	i = random.randint(left, right)
	li[i], li[left] = li[left], li[i]
	partition(li, left, right)

(3) 快速排序 切片实现

def quick_sort(li):
	if len(li) < 2:
		return li
	tmp = li[0]
	left = [i for i in li[1:] if i <= tmp]
	right = [i for i in li[1:] if i > tmp]
	left = quick_sort(left)
	right = quick_sort(right)
	return left + [tmp] + right

(4) Leetcode912. 排序数组

给定一个整数数组 nums,将该数组升序排列。

 

示例 1:

输入:[5,2,3,1]
输出:[1,2,3,5]
示例 2:

输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
 

提示:

1 <= A.length <= 10000
-50000 <= A[i] <= 50000
class Solution(object):
    def sortArray(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        #return self.quick_sort(nums, 0, len(nums) - 1)
        return self.quick_sort(nums)
    '''    
    def quick_sort(self, nums, left, right):
        if left > right:
            return 
    
        if left < right:
            mid = self.partition(nums, left, right)
            self.quick_sort(nums, left, mid-1)
            self.quick_sort(nums, mid+1, right)
        return nums

    def partition(self, nums, left, right):
        tmp = nums[left]
        while left < right:
            while left < right and nums[right] >= tmp:
                right -= 1
            nums[left] = nums[right]
            while left < right and nums[left] <= tmp:
                left += 1
            nums[right] = nums[left]
        nums[left] = tmp
        return left
    '''
    def quick_sort(self, nums):
        if len(nums) < 2:
            return nums
        tmp = nums[0]
        left = [i for i in nums[1:] if i <= tmp]
        right = [i for i in nums[1:] if i > tmp]
        left = self.quick_sort(left)
        right = self.quick_sort(right)
        
        return  left + [tmp] + right

发布了126 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43442524/article/details/103944978