我是靠谱客的博主 迅速铃铛,这篇文章主要介绍【Leetcode刷题篇】- 数组排序,现在分享给大家,希望可以做个参考。

给你一个整数数组 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:插入排序

class Solution {
    // 插入排序
    public int[] sortArray(int[] nums) {
        for(int i=1;i<nums.length;i++){
            for(int j=i-1;j>=0&&nums[j]>nums[j+1];j--){
                // 交换
                swap(nums,j,j+1);
            }
        }
        return nums;
    }
    // 交换两数
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i]  = nums[j];
        nums[j]  = temp;
    } 
}

解题思路:冒泡排序

class Solution {
    // 冒泡排序-稳定排序
    public int[] sortArray(int[] nums) {
        for(int i=nums.length-1;i>=0;i--){
            for(int j=0;j<i;j++){
                if(nums[j]>nums[j+1]){
                    // 交换
                    swap(nums,j,j+1);
                }
            }
        }
        return nums;
    }

    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

解题思路三、选择排序

class Solution {
    // 选择排序
    public int[] sortArray(int[] nums) {
        for(int i=0;i<nums.length-1;i++){
            int minIndex = i;
            for(int j=i+1;j<nums.length;j++){
                minIndex = nums[minIndex]>nums[j]?j:minIndex;
            }
            swap(nums,i,minIndex);
        }
        return nums;
    }
    // 交换
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i]  = nums[j];
        nums[j]  = temp;
    }
}

解题思路四:归并排序

class Solution {
    // 归并排序
    public int[] sortArray(int[] nums) {
        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)>>1);
        mergeSort(nums,l,mid);
        mergeSort(nums,mid+1,r);
        merge(nums,l,mid,r);
    }
    // 归并
    public void merge(int[] nums,int l,int mid,int r){
        // 归并
        int[] temp = new int[r-l+1];
        // 索引
        int index = 0;
        int p1 = l;
        int p2 = mid+1;
        // 继续走
        while(p1<=mid&&p2<=r){
            temp[index++] = nums[p1]<nums[p2]?nums[p1++]:nums[p2++];
        }
        while(p1<=mid){
            temp[index++] = nums[p1++];
        }
        while(p2<=r){
            temp[index++] = nums[p2++];
        }
        // 复制完
        for(int i=0;i<temp.length;i++){
            nums[l+i] = temp[i];
        }

    }
}

解题思路五、快速排序

class Solution {
    // 快速排序
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int l,int r){
        if(l<r){
            int[] arr = sort(nums,l,r);
            quickSort(nums,l,arr[0]-1);
            quickSort(nums,arr[1]+1,r);
        }
    }

    public int[] sort(int[] nums,int L,int R){
        int less = L-1;
        int more = R;
        while(L<more){
            if(nums[L]>nums[R]){
                swap(nums,L,--more);
            }else if(nums[L]<nums[R]){
                swap(nums,L++,++less);
            }else{
                L++;
            }
        }
        //最后交换
        swap(nums,more,R);
        return new int[]{less+1,more};
    }

    // 交换
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i]  = nums[j];
        nums[j]  = temp;
    }
}

解题思路:堆排序

class Solution {
    // 堆排序
    public void slipDown(int[] nums,int parentIndex,int length){
        while(2*parentIndex+1<length){
            int childIndex = 2*parentIndex+1;
            if(childIndex+1<length&&nums[childIndex+1]>nums[childIndex]){
                childIndex = childIndex+1;
            }
            if(nums[parentIndex]>nums[childIndex]){
                break;
            }
            swap(nums,parentIndex,childIndex);
            parentIndex = childIndex;
        }
    }

    public int[] sortArray(int[] nums) {
        for(int i=nums.length/2;i>=0;i--){
            slipDown(nums,i,nums.length);
        }
        for(int i=nums.length-1;i>=0;i--){
            swap(nums,0,i);
            slipDown(nums,0,i);
        }
        return nums;
    }

    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i]  = nums[j];
        nums[j]  = temp;
    }
}

最后

以上就是迅速铃铛最近收集整理的关于【Leetcode刷题篇】- 数组排序的全部内容,更多相关【Leetcode刷题篇】-内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(138)

评论列表共有 0 条评论

立即
投稿
返回
顶部