给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
数据范围: ,数组中每个元素都满足
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度 ,空间复杂度
注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。
[5,2,3,1,4]
[1,2,3,4,5]
[5,1,6,2,5]
[1,2,5,5,6]
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # # 冒泡,选择在时间复杂度上都通不过,使用快排可以,但空间占用较大 class Solution: def MySort(self , arr ): # write code here if len(arr) <= 1: return arr return self.quick_sort(arr) def quick_sort(self, array): if len(array) >= 2: base = array.pop(0) left = [] right = [] for i in array: if i < base: left.append(i) else: right.append(i) return self.quick_sort(left) + [base] + self.quick_sort(right) return array
import copy class Solution: def MySort(self , arr ): res = copy.deepcopy(arr) res.sort() return res # write code here能用何必造轮子呢
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # class Solution: def partition(self, arr, low, high): base = arr[low] while low < high: while low < high and arr[high] >= base: high -= 1 arr[low] = arr[high] while low < high and arr[low] <= base: low += 1 arr[high] = arr[low] arr[low] = base return low def quick_sort(self, arr, low, high): mid = self.partition(arr, low, high) if low < mid - 1: self.quick_sort(arr, low, mid-1) if mid + 1 < high: self.quick_sort(arr, mid+1, high) def MySort(self , arr ): if len(arr) > 0: self.quick_sort(arr, 0, len(arr)-1) return arr
class Solution: def MySort(self , arr ): # write code here # return self.bubble_sort(arr) # return self.select_sort(arr) # return self.insert_sort(arr) return self.quick_sort(arr) # return self.merge_sort(arr) def bubble_sort(self, arr): # 冒泡排序 不通过 for i in range(len(arr) - 1): for j in range(len(arr) - i - 1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr def select_sort(self, arr): # 选择排序 不通过 for i in range(len(arr)): min_index = i for j in range(i+1, len(arr)): if arr[j] < arr[min_index]: min_index = j arr[min_index], arr[i] = arr[i], arr[min_index] return arr def insert_sort(self, li): # 插入排序 不通过 for i in range(1, len(li)): tmp = li[i] # tmp要插入的之 j = i - 1 while j >= 0 and li[j] > tmp: # 前面的值比tmp大 li[j+1] = li[j] # 前面的值向后移一位 j = j - 1 # 继续向前对比 li[j+1] = tmp # 直到while不满足条件, 也就是前面的值比tmp小, 插入到比tmp小的值后 return li def quick_sort(self, li): # 快速排序 通过 if len(li) < 2: return li else: tmp = li[0] less = [i for i in li[1:] if i <= tmp] more = [i for i in li[1:] if i > tmp] return self.quick_sort(less) + [tmp] + self.quick_sort(more) def merge_sort(self, li): # 归并排序 可能通过 可能不通过 if len(li) < 2: return li else: num = len(li) // 2 left = self.merge_sort(li[:num]) right = self.merge_sort(li[num:]) return self.merge(left, right) def merge(self, left, right): l,r = 0,0 result = [] while l < len(left) and r < len(right): if left[l] < right[r]: result.append(left[l]) l += 1 else: result.append(right[r]) r += 1 result += left[l:] result += right[r:] return result
插入排序为啥不行,因为时间复杂度高吗
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # class Solution: def MySort(self , arr ): # write code here list=[] list.append(arr[0]) arr.remove(arr[0]) # arrIndex=0 listIndex=0 for i in arr: for j in list: listIndex+=1 if i<=j: list.insert(listIndex-1,i) break if listIndex==len(list): list.append(i) listIndex=0 return list