数组排序java实现——快速排序和计数排序

这篇博客介绍了两种排序算法的应用。第一种是快速排序,通过选取基准元素并进行分区操作实现排序,时间复杂度为$O(nlogn)$。第二种是计数排序,通过统计每个元素出现的次数,然后重新分配元素到正确的位置,适用于数值范围较小的情况,时间复杂度为$O(n+k)$,其中k为数值范围。这两种方法在不同场景下各有优势。


## 题目地址(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]


 

提示:

1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000
```

## 第一种解法

快速排序

Java Code

class Solution {

    public int getIndex(int[] nums,int low,int high){
        int tmp=nums[low];
        while(low<high){
            while(nums[high]>=tmp && low<high){
                high--;
            } 
            nums[low]=nums[high];//小于基准的元素往前放着
            while(nums[low]<=tmp && low<high){
                low++;
            }
            nums[high]=nums[low];//大于基准的元素往后放
        }
        nums[low]=tmp;//碰头就把tmp写进去就行
        return low;//返回基准排好的位置
    }

    public void quick_sort(int[] arr,int low,int high){
        if(low<high){
            int index1=getIndex(arr,low,high);
            quick_sort(arr,low,index1-1);
            quick_sort(arr,index1+1,high);
        }
    }
    public int[] sortArray(int[] nums) {
        quick_sort(nums,0,nums.length-1);
        return nums;
    }
}


**复杂度分析**

令 n 为数组长度。

- 时间复杂度:$O(nlogn)$
- 空间复杂度:$O(n)$

第二种解法:

计数排序

定义一个足够长的数组,数组小标表示元素值,如果待排序数组元素i出现过一次,就将数组arr[i]的值加1,最后再定义一个与待排序数组等长数组nums1,遍历arr,依次将元素值从小到大填入到nums1中

class Solution {

    public int[] sortArray(int[] nums) {
        int[] arr1=new int[50000*2+1];
        for(int i:nums){
            arr1[i+50000]++;//统计元素出现次数
        }
        int[] nums1=new int[nums.length];
        int a1=0;
        for(int i=0;i<arr1.length;i++){//依次遍历,然后将出现次数不为0的元素填入到nums1中
            for(int j=0;j<arr1[i];j++){
                nums1[a1]=i-50000;
                a1+=1;
            }
        }
        return nums1;
    }
}

时间复杂度:O(50000*2+1)

空间复杂度:O(50000*2+1)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值