常见的排序算法模板

冒泡排序

public void sorts(int[] a) {
    for(int i=0;i<a.length;i++){
        boolean flag=false;
        for(int j=0;j<a.length-1-i;j++){
            if(a[j]>a[j+1]){
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=true;
            }
        }
        if(!flag){
            break;
        }
    }
}

选择排序

public void sorts(int[] a) {
    for(int i=0;i<a.length-1;i++){
        int minIndex=i;
        for(int j=i+1;j<a.length;j++){
            if(a[minIndex]>a[j]){
                minIndex=j;
            }
        }
        int temp=a[i];
        a[i]=a[minIndex];
        a[minIndex]=temp;
    }
}

插入排序

public void sorts(int[] a) {
    for(int i=1;i<a.length;i++){
        int cur=a[i];
        int preIndex=i-1;
        while(preIndex>=0 && a[preIndex]>cur){
            a[preIndex+1]=a[preIndex];
            preIndex--;
        }
        a[preIndex+1]=cur;
    }
}

快速排序

public void sort(int[] nums,int left,int right){
    if(left>=right){
        return;
    }
    int low=left+1,high=right;
    while(low<=high){
        if(nums[low]<=nums[left]){
            low++;
        }else{
            swap(nums,low,high--);
        }
    }
    swap(nums,left,--low);
    sort(nums,left,low-1);
    sort(nums,low+1,right);
}
public void swap(int[] nums,int x,int y){
    int temp=nums[x];
    nums[x]=nums[y];
    nums[y]=temp;
}

归并排序

public void sort(int[] nums,int left,int right,int[] temp){
    if(left>=right){
        return;
    }
    int mid=left+(right-left)/2;
    sort(nums,left,mid,temp);
    sort(nums,mid+1,right,temp);
    merge(nums,left,mid,right,temp);
}
public void merge(int[] nums,int left,int mid,int right,int[] temp){
    int i=left,j=mid+1,low=left;
    while(i<=mid && j<=right){
        if(nums[i]<=nums[j]){
            temp[left++]=nums[i++];
        }else{
            temp[left++]=nums[j++];
        }
    }
    while(i<=mid){
        temp[left++]=nums[i++];
    }
    while(j<=right){
        temp[left++]=nums[j++];
    }
    for(int k=low;k<=right;k++){
        nums[k]=temp[k];
    }
}

堆排序

public void sort(int[] nums){
    if(nums==null || nums.length==0){
        return;
    }
    for(int i=(nums.length-2)/2;i>=0;i--){//从最后一个非叶子结点开始建堆
        adjustHeap(nums,i,nums.length-1);
    }
    for(int i=nums.length-1;i>=0;i--){//将最大的元素放在最后,减小堆的规模,重新调整堆,将最大元素放在顶部
        swap(nums,0,i);
        adjustHeap(nums,0,i-1);
    }
}
public void adjustHeap(int[] nums,int curIndex,int end){
    while(2*curIndex+1<=end){//左子节点是否在范围内
        int son=2*curIndex+1;
        if(son+1<=end && nums[son]<nums[son+1]){//找到最大的子结点
            son++;
        }
        if(nums[curIndex]<nums[son]){//与最大的子结点互换元素
            swap(nums,curIndex,son);
        }
        curIndex=son;//当前结点指针转到子结点
    }
}
public void swap(int[] nums,int x,int y){
    int temp=nums[x];
    nums[x]=nums[y];
    nums[y]=temp;
}
posted @ 2021-02-17 10:46  小昊子丫  阅读(52)  评论(0编辑  收藏  举报