题解 | #排序#

排序

http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

手写三种经典的排序方式(冒泡,快排,堆排序)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        // 写三种,快速排序,堆排序和冒泡排序
        //冒泡法O(n*n)
//         bubbleSort(arr,0,arr.length-1);
        //快速排序O(Nlog(N))
//         quickSort(arr,0,arr.length-1);
        //堆排序 O(Nlog(N))
        heapSort(arr);
        return arr;
        
        
    }
    public void swap(int []arr,int i,int j){
           if(i!=j){
               arr[i]^=arr[j];
               arr[j]^=arr[i];
               arr[i]^=arr[j];
           }    
           else
               return ;
    }
    public void bubbleSort(int[] arr,int start,int end){  //轻的先上来
        for(int i=start;i<=end-1;i++){
            for(int j=i+1;j<=end;j++){
                if(arr[i]>=arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }
    public void quickSort(int []arr,int start,int end){
        if(start<end)  //大于或者等于的话就不用排了,说明只有一个元素或者是第一个元素
        {
            int key=arr[start];   //将第一个作为中枢元素
            int i=start;
            for(int j=i+1;j<=end;j++){
                if(arr[j]<=key){   //小的移动到最靠近目前的元素的地方
                    swap(arr,j,++i);
                }
            }
            arr[start]=arr[i];  //先把位置移出来
            arr[i]=key;
            quickSort(arr,start,i-1);
            quickSort(arr,i+1,end);
        }
    }
    public void heapSort(int[]arr){
        buildMaxHeap(arr,arr.length);
        for(int j=arr.length-1;j>0;j--){
            swap(arr,0,j);
            adjustHeap(arr,0,j);//对0到j(此时为长度)重新调整大顶堆
        }
        
        
    }
    public void buildMaxHeap(int[]arr,int heapSize){
        for(int i=(heapSize-2)/2;i>=0;i--){
            adjustHeap(arr,i,heapSize);
        }
    
    
    
    }
    public void adjustHeap(int[]arr,int i,int heapSize){
        int left=2*i+1;
        int right=2*i+2;
        int largest=i;
        if(left<heapSize&&arr[left]>=arr[largest]){
            largest=left;
        }
        if(right<heapSize&&arr[right]>=arr[largest]){
            largest=right;
        }
        if(largest!=i)//最大的不是父节点了
        {
            swap(arr,i,largest);
            adjustHeap(arr,largest,heapSize);   //交换之后,以原来的子节点作为父节点继续进行调整
        }
        
    }
    
}
全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务