LeetCode 912 排序陣列

2022-06-24 21:39:15 字數 3946 閱讀 5999

difficulty:中等

給你乙個整數陣列nums,請你將該陣列公升序排列。

示例 1:

輸入:nums = [5,2,3,1]

輸出:[1,2,3,5]

示例 2:

輸入:nums = [5,1,1,2,0,0]

輸出:[0,0,1,1,2,5]

1 <= nums.length <= 50000

-50000 <= nums[i] <= 50000

solution

快速排序實現一:

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

left, right = 0, len(nums)-1

self.qsort(nums, left, right)

return nums

def qsort(self, arr, low, high):

if len(arr) <= 1:

return arr

if low < high:

pivot = self.partition(arr, low, high)

self.qsort(arr, low, pivot-1)

self.qsort(arr, pivot+1, high)

def partition(self, arr, low, high):

i = low - 1

pivot = arr[high]

for j in range(low, high):

if arr[j] <= pivot:

i += 1

arr[i], arr[j] = arr[j], arr[i]

arr[i+1], arr[high] = arr[high], arr[i+1]

return i+1

現在這題如果寫快速排序必須得選隨機基準值才能過,不然會超時,補充乙個隨機選擇基準值的解法:

import random

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

left, right = 0, len(nums) - 1

self.qsort(nums, left, right)

return nums

def qsort(self, arr, low, high):

if len(arr) <= 1:

return arr

if low < high:

p = self.partition(arr, low, high)

self.qsort(arr, low, p-1)

self.qsort(arr, p+1, high)

def partition(self, arr, low, high):

i = low - 1

p = random.randint(low, high)

arr[p], arr[high] = arr[high], arr[p]

pivot = arr[high]

for j in range(low, high):

if arr[j] <= pivot:

i += 1

arr[i], arr[j] = arr[j], arr[i]

arr[i+1], arr[high] = arr[high], arr[i+1]

return i+1

快速排序實現二:

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

# 快速排序

less =

more =

pivot_list =

if len(nums) <= 1:

return nums

else:

pivot = nums[0]

for item in nums:

if item < pivot:

elif item > pivot:

else:

less = self.sortarray(less)

more = self.sortarray(more)

return less + pivot_list + more

氣泡排序,不過超出了時間限制,沒有通過。

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

if not nums:

return

num_len = len(nums)

for i in range(num_len-1,0,-1):

for j in range(i):

if nums[j] > nums[j+1]:

nums[j], nums[j+1] = nums[j+1], nums[j]

return nums

插入排序,同樣也超出了時間限制,沒有通過。

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

if not nums:

return

num_len = len(nums)

for i in range(1, num_len):

key = nums[i]

j = i - 1

while j >= 0 and key < nums[j]:

nums[j+1] = nums[j]

j -= 1

nums[j+1] = key

return nums

堆排序

class solution:

def sortarray(self, nums: list[int]) -> list[int]:

self.heapsort(nums)

return nums

def heapify(self, arr, n, i):

largest = i

l = 2 * i + 1 # 左子節點

r = 2 * i + 2 # 右子節點

if l < n and arr[largest] < arr[l]:

largest = l

if r < n and arr[largest] < arr[r]:

largest = r

if largest != i:

arr[largest], arr[i] = arr[i], arr[largest]

self.heapify(arr, n, largest) # 在處理新的葉子節點後會導致原來排序好的堆混亂了,所以需要重新進行堆排序

# 堆排序

def heapsort(self, arr):

n = len(arr)

# 從最後乙個非葉子節點開始構建最大堆

for i in range(n // 2 - 1, -1, -1):

self.heapify(arr, n, i)

for i in range(n-1, 0, -1):

arr[i], arr[0] = arr[0], arr[i] # 堆頂的最大元素交換到堆底

self.heapify(arr, i, 0)

leetcode 912 排序陣列

給定乙個整數陣列 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實際上python自帶的sort函式是最好的,用了timesor...

leetcode 912 排序陣列

這是乙個排序題,都是老生常談的東西了,之前用的排序演算法都是通過比較大小進行排序,貼一下不用比較大小的計數排序的 計數排序的思想是 對於陣列中乙個需要排序的數字x來說,算出陣列中小於等於它的數字個數便可得出該數在有序陣列中的位置。該演算法只適用於整數陣列,時間複雜度為o n k o n k o n ...

LeetCode 912 排序陣列

排序陣列 給你乙個整數陣列 nums,請你將該陣列公升序排列。class solution for int i 0 i nums.length i 如果沒有資料交換,說明已經完全有序,提前退出迴圈if flag return nums class solution 記錄最小值的索引 int min ...