912. 排序数组
难度中等506收藏分享切换为英文接收动态反馈
给你一个整数数组 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 <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104
题目思路:
用来当快速排序模板
寻找数组中的中间值用来快速排序,软件将中间值与数组最右边的值进行互换,
之后遍历数组,小于flag的,与num[i]互换,
将小于flag的往左边放,大于的往右边放
,软件再分割成两部,递归重复上述操作-本题的意义用来当快速排序的代码模板
Python代码:
class Solution: def dfs1(self , nums , l , r): miding = random.randint(l , r) #构建哨兵 nums[miding] , nums[r] = nums[r] , nums[miding] #将哨兵放入最右边 i = l-1 #i用来指向大于哨兵的值 for j in range(l , r): if nums[j] <nums[r]: i += 1 nums[i] , nums[j] = nums[j] , nums[i] i += 1 nums[i] , nums[r] = nums[r] , nums[i] #将哨兵放入大于哨兵的值和小于哨兵的值之间 return i def dfs_quick(self , nums , l , r): if r-l<=0: #结束标注 return mid = self.dfs1(nums, l , r) self.dfs_quick(nums , l , mid-1) self.dfs_quick(nums , mid+1 , r) def sortArray(self, nums: List[int]) -> List[int]: self.dfs_quick(nums, 0, len(nums) - 1) return nums
C++代码:
class Solution { int dfs(vector<int> &nums , int l , int r){ int miding = rand() % (r - l + 1) + l;//rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数。找哨兵 swap(nums[r] , nums[miding]);//交换两个的值 int i = l-1; for (int j=l; j<=r-1; j++){ if (nums[j] < nums[r]){ //将比中间值小的值都放到左边,比中间值大的都放到右边 i用来指向大于哨兵的值 i += 1; swap(nums[i] , nums[j]); } } swap(nums[i+1] , nums[r]); //将哨兵放入小的值和大的值之间 return i+1; } void dfs_quick(vector<int> &nums , int l , int r){ if (r-l<=0){ return; } int mid = dfs(nums , l , r); //将数组分为整理好的小于哨兵的值 和 大于哨兵的值,然后分别继续细分进行排序 dfs_quick(nums , l , mid-1); dfs_quick(nums , mid+1 , r); } public: vector<int> sortArray(vector<int>& nums) { srand((unsigned)time(NULL)); //建立随机数 dfs_quick(nums , 0 , (int)nums.size()-1); return nums; } };