力扣-排序算法

部分题解保存

排序数组-快速排序

class Solution {
    private final static Random random = new Random(System.currentTimeMillis());

    public int[] sortArray(int[] nums) {
        //20221015再回顾
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int left,int right){
        if(left>=right) return;
        int pivotIndex = partition(nums,left,right);
        quickSort(nums,left,pivotIndex-1);
        quickSort(nums,pivotIndex+1,right);
    }
    private int partition(int[] nums, int left,int right){
        int randomIndex = left+random.nextInt(right-left+1);
        swap(nums,left,randomIndex);
        int pivot = nums[left];
        int j = left;
        // 1 2 0 4 3
        // j i       ri
        for (int i = left+1; i <= right; i++) {
            if (nums[i]<=pivot){
                // 1 2 0 4 3
                // j   i
                j++;
                // 1 2 0 4 3
                //   j i
                swap(nums,i,j);
                // 1 0 2 4 3
                //   j i
            }
        }
        // 1 0 2 4 3
        //   j       i
        //目前就是j在比pivot小的最后一个元素的位置,但是毕竟不是pivot所以要交换
        swap(nums,left,j);
        // 0 1 2 4 3
        //   j       i
        return j;//返回的就是pivotIndex左边的比nums[j]小
    }
    private void swap(int[] nums,int i,int j){
        int t = nums[i];
        nums[i] = nums[j];
        nums[j]=t;
    }
}

148-链表排序-归并算法

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:

输入:head = []
输出:[]
提示:

链表中节点的数目在范围 [0, 5 * 104] 内
-105 <= Node.val <= 105
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?


class Solution {
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next!=null&&fast.next.next!=null){
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode tmp = slow.next;
        slow.next = null;//断开这个链表
        ListNode left = sortList(head);//left这里会直接把整个左边的都看作是left开头的链表
        ListNode right = sortList(tmp);//right是把整个右边作为链表
        //下面是合并也就是left和right都是只有一个元素了。
        ListNode h = new ListNode(0);
        ListNode res = h;
        while(left!=null && right != null){
            if (left.val<right.val) {
                h.next =left;
                left = left.next;//left就指向了null
            }else {
                h.next =right;
                right = right.next;//right就指向了null
            }
            h=h.next;
        }
        h.next = left!=null ? left:right;
        return res.next;
    }
}
posted @ 2022-10-14 20:28  Indullged  阅读(32)  评论(0编辑  收藏  举报