【归并排序/快排/堆排序】912. 排序数组
创始人
2024-11-03 20:36:44
0

力扣连接:. - 力扣(LeetCode)

归并排序

对左右子集合分别排序,然后合并两个有序数组

class Solution {     int[] nums;     public int[] sortArray(int[] nums) {         this.nums = nums;         return sort(0, nums.length-1);     }      int[] sort(int st, int ed) {         if(st == ed) {             return new int[]{nums[st]};         }         //对左右分别排序         int m = st + (ed-st)/2;         int[] leftArr = sort(st, m);         int[] rightArr = sort(m+1, ed);          //合并两个有序数组         int[] newArr = new int[ed-st+1];         int i=0,j=0,k=0;         while(i

快排

每次任意指定一个数作为标杆,小于标杆的放左边,大于标杆的放右边,对左右子数组重复这个流程

时间复杂度:O(n log n)

空间复杂度:O(n)

class Solution {     int[] nums;      public int[] sortArray(int[] nums) {         this.nums = nums;         sort(0, nums.length - 1);         return nums;     }      void sort(int st, int ed) {         if (st >= ed)             return;         int p = st, l = st, r = ed;         while (l < r) {             // r指向第一个小于等于nums[p]的,注意这和下个while顺序不能随便换,要保证l和r最后指向小于等于nums[p]的地方             while (l < r && nums[r] > nums[p])    r--;             // l指向第一个大于nums[p]的             while (l < r && nums[l] <= nums[p])    l++;             swap(l, r);         }         swap(p, l);         sort(st, l - 1);         sort(l + 1, ed);     }      void swap(int i, int j) {         int temp = nums[i];         nums[i] = nums[j];         nums[j] = temp;     }  }

堆排序

时间复杂度:O(nlogn)

视频讲解:排序算法:堆排序【图解+代码】_哔哩哔哩_bilibili

大顶堆:父节点比两个子节点都要大

下标规律:

节点 i 的父节点:(i-1)/2

节点 i 的左子节点:i*2+1

节点i的右子节点:(i+1)*2

维护大顶堆:从下往上,第一个有孩子节点的节点开始,取根节点、左孩子、右孩子之间的最大值 换到根节点处

排序:堆顶的元素一定是最大的,每次将堆顶元素放到尾部,然后剩下元素再次维护大顶堆,重复

class Solution {     int[] nums;     public int[] sortArray(int[] nums) {         this.nums = nums;         int len = nums.length;         sort(len);         return nums;     }      void sort(int len) {         //建堆         for(int i= len/2-1;i>=0;i--) {             heapify(len, i);         }         //排序         for(int i=len-1;i>0;i--) {             swap(i, 0);             //i以后的数是已经排序好的             heapify(i, 0);         }      }      //i: 待维护的节点下标     //len: 参与维护大顶堆的数组长度     void heapify(int len, int i) {         int biggest = i;         int left = i*2+1;         int right = (i+1)*2;         //len用来约束递归终止条件         if(left

相关内容

热门资讯

微信炸金花购买房卡/微信斗牛如... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
炸金花微信群购买房卡/牛牛链接... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
拼三张从哪里买房卡/新海贝大厅... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
微信炸金花房卡一张多少钱/微信... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信链接炸金花房卡在哪买的/微... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
微信群链接炸金花房卡/微信里斗... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
怎么买炸金花房间链接房卡/微信... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信玩链接牛牛房卡/新人皇大厅... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享受...
拼三张房卡链接去哪里买/橘子大... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
微信玩炸金花怎么买房卡/欢乐游... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
炸金花房卡链接在哪买的/狂飙大... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
如何创建牛牛房间卡/牛至尊大厅... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享受...
微信里上玩拼三张购买房卡/神牛... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信里面斗牛链接房卡/九酷大厅... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享受...
炸金花如何开好友房间房卡/微信... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信炸金花在哪里充值房卡/新天... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
微信里面拼三张房卡哪里买/新皇... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
微信群开牛牛房卡/新天地大厅牛... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受更...
微信打炸金花链接房卡怎么买/怎... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
微信玩炸金花房卡怎么买/开牛牛... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...