題目鏈接傳送門
說明
代碼
class Solution {
public int[] sortArray(int[] nums) {
//排序?
//計數排序o(n)
// sortTong(nums);
//歸併
// int[] temp=new int[nums.length];
// sortGuibing(nums,temp,0,nums.length-1);
//快排,
// sortQuick(nums,0,nums.length-1);
//堆排序
sortHeapMax(nums);
//希爾,都是o(n*logn)
return nums;
}
//計數排序
public void sortTong(int[] nums){
int[] a=new int[100000+5];
for(int i=0;i<nums.length;i++){
a[nums[i]+50000]++;
}
int p=0;
for(int i=0;i<a.length;i++){
while(a[i]>0){
nums[p++]=i-50000;
a[i]--;
}
}
}
//手撕快排
public int partion(int[] nums,int l,int r){
int x=nums[l];
int i=l;
for(int j=l+1;j<=r;j++){
if(nums[j]<=x){
i++;
int temp=nums[i];nums[i]=nums[j];nums[j]=temp;
}
}
nums[l]=nums[i];
nums[i]=x;
return i;
}
public void sortQuick(int[] nums,int l,int r){
if(l>=r)return;
int k=partion(nums,l,r);
sortQuick(nums,l,k-1);
sortQuick(nums,k+1,r);
return;
}
// public partition
//堆排序
public void maxHeapify(int[] nums,int i,int len){
while((i<<1)+1<=len){//有子節點
int lson=(i<<1)+1;//左兒子
int rson=(i<<1)+2;//右兒子
int large=i;
if(lson<=len&&nums[lson]>nums[large]){
large=lson;
}
if(rson<=len&&nums[rson]>nums[large]){
large=rson;
}
if(large==i)break;
//交換i與large
int temp=nums[i];nums[i]=nums[large];nums[large]=temp;
i=large;
}
}
public void biuldMaxHeap(int[] nums,int len){
//從下向上建堆
for(int i=len/2;i>=0;i--){
maxHeapify(nums,i,len);
}
}
public void sortHeapMax(int[] nums){
int len=nums.length-1;
biuldMaxHeap(nums,len);
for(int i=len;i>=1;i--){
int temp=nums[i];nums[i]=nums[0];nums[0]=temp;
len--;
maxHeapify(nums,0,len);
}
// while(len>0){
// int temp=nums[len];nums[len]=nums[0];nums[0]=temp;
// len--;
// maxHeapify(nums,0,len);
// }
return;
}
//歸併sortGuibing(a,b,l,r)代表a[l,r]進行排序b爲臨時數組
public void sortGuibing(int[] nums ,int[] temp,int l,int r){
if(l>=r)return;
int mid=(l+r)>>1;
sortGuibing(nums,temp,l,mid);
sortGuibing(nums,temp,mid+1,r);
int i=l,j=mid+1,p=l;
while(i<=mid&&j<=r){
if(nums[i]<nums[j])temp[p++]=nums[i++];
else temp[p++]=nums[j++];
}
while(i<=mid)temp[p++]=nums[i++];
while(j<=r)temp[p++]=nums[j++];
for(int k=l;k<=r;k++){
nums[k]=temp[k];
}
return;
}
//希爾
}