排序算法-快排归并堆排序-高频题-912. 排序数组

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-快排归并堆排序-高频题-912. 排序数组相关的知识,希望对你有一定的参考价值。

一、题目描述

给你一个整数数组 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]

二、解题

快速排序

快速排序在选取划分点的时候如果都是选取第一个数,那么在一种情况下[5,4,3,2,1],排序起来非常慢,所以选取一个随机数这样可以减少这种最坏情况的发生。

class Solution 
    public int[] sortArray(int[] nums) 
        //快速排序
        int left = 0,right = nums.length-1;
        quicksort(nums,left,right);
        return nums;

    
    public void quicksort(int[] nums,int left,int right)
        if(left <= right)
            int par = randomizedPartition(nums,left,right);
            quicksort(nums,left,par-1);
            quicksort(nums,par+1,right);
        
    

    public int randomizedPartition(int[] nums, int left, int right) 
        int index = new Random().nextInt(right - left + 1) + left; // 随机选一个作为我们的主元
        swap(nums, left, index);
        return partition(nums, left, right);
    

    //划分
    public int partition(int[] nums,int left,int right)
        int pivot = nums[left];
        int j = left;
        for(int i=left+1;i<=right;i++)
            if(nums[i] < pivot)
                j++;
                swap(nums,j,i);
            
        
        swap(nums,left,j);
        return j;
    

    //交换数据
    public void swap(int[] nums,int left,int right)
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    

归并排序

class Solution 
    int[] tmp;//辅助数组
    public int[] sortArray(int[] nums) 
        //归并排序
        int len = nums.length;
        tmp = new int[len];
        mergeSort(nums, 0, nums.length - 1);
        return nums;


    
    public void mergeSort(int[] nums,int l,int r)
        if(l >= r)
            return ;
        
        int mid = l+(r - l)/2;
        mergeSort(nums,l,mid);
        mergeSort(nums,mid+1,r);
        int i = l, j = mid + 1;
        int cnt = 0;
        while (i <= mid && j <= r) 
            if (nums[i] <= nums[j]) 
                tmp[cnt++] = nums[i++];
             else 
                tmp[cnt++] = nums[j++];
            
        
        while (i <= mid) 
            tmp[cnt++] = nums[i++];
        
        while (j <= r) 
            tmp[cnt++] = nums[j++];
        
        for (int k = 0; k < r - l + 1; ++k) 
            nums[k + l] = tmp[k];
        
    

堆排序

堆排序的思想就是先将待排序的序列建成大根堆,使得每个父节点的元素大于等于它的子节点。此时整个序列最大值即为堆顶元素,我们将其与末尾元素交换,使末尾元素为最大值,然后再调整堆顶元素使得剩下的 n-1n−1 个元素仍为大根堆,再重复执行以上操作我们即能得到一个有序的序列。

class Solution 
    public int[] sortArray(int[] nums) 
        heapSort(nums);
        return nums;
    

    public void heapSort(int[] nums) 
        int len = nums.length - 1;
        buildMaxHeap(nums, len);
        for (int i = len; i >= 1; --i) 
            swap(nums, i, 0);
            len -= 1;
            maxHeapify(nums, 0, len);
        
    

    public void buildMaxHeap(int[] nums, int len) 
        for (int i = len / 2; i >= 0; --i) 
            maxHeapify(nums, i, len);
        
    

    public void maxHeapify(int[] nums, int i, int len) 
        for (; (i << 1) + 1 <= len;) 
            int lson = (i << 1) + 1;
            int rson = (i << 1) + 2;
            int large;
            if (lson <= len && nums[lson] > nums[i]) 
                large = lson;
             else 
                large = i;
            
            if (rson <= len && nums[rson] > nums[large]) 
                large = rson;
            
            if (large != i) 
                swap(nums, i, large);
                i = large;
             else 
                break;
            
        
    

    private void swap(int[] nums, int i, int j) 
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    

以上是关于排序算法-快排归并堆排序-高频题-912. 排序数组的主要内容,如果未能解决你的问题,请参考以下文章

排序---内部排序算法(快排希尔排序归并排序基数排序冒泡选择排序)比较

[算法基础]快排归并堆排序比较

你所知道的十大排序算法的总结(冒泡,选择,插入,希尔,归并,快排,堆排序,计数排序,桶排序,基数排序)

十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数-1

排序算法专题:快排和归并排序

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)