简单选择排序、冒泡排序、直接插入排序、希尔排序、堆排序、归并排序

简单选择排序,最坏最好平均的时间复杂度都是O(n^2),排序是稳定的

public class SelectiveSort{
    public static void sSort(int[] nums){
        if(nums==null||nums.length==0){
            return;
        }
        int min;
        for(int i=0;i<nums.length;i++){
            min = nums[i];
            for(int j=i+1;j<nums.length;j++){
                if(nums[j]<min){
                    min = nums[j];
                }
            }
            //交换min和nums[i]
            //swap方法,省略
        }
    }
    public static void main(String[] args){
        
    } 
}

直接插入排序:最坏时间复杂度O(n^2),最好时间复杂度O(n),平均时间复杂度O(n^2)

public class InsertSort{
    public static void iSort(int[] nums){
        if(nums==null||nums.length<=0){
            return;
        }
        for(int i=0;i<nums.length;i++){
            for(int j=i;j>=1;j--){
                if(nums[j]<nums[j-1]){
                    //交换nums[j]、nums[j-1]
                    //通用swap方法
                }
            }
        }    
    }    
    public static void main(String[] args){
    
    }
}

冒泡排序及其优化:最坏时间复杂度O(n^2),最好时间复杂度O(n),平均时间复杂度O(n^2)

//未优化版
public class BubbleSort{
    public static void bSort(int[] nums){
        if(nums==null||nums.length<=0){
            return;
        }
        for(int i=0;i<nums.length;i++){  //控制循环次数
            for(int j=0;j<nums.length-i-1;i++){
                if(nums[j]>nums[j+1]){
                    //交换
                }
            }
        }
    }
    public static void main(String[] args){
        
    }
}
//优化版
public class BubbleSort{
    public static void bSort(int[] nums){
        if(nums==null||nums.length<=0){
            return;
        }
        boolean flag = false;
        for(int i=0;i<nums.length;i++){  //控制循环次数
            for(int j=0;j<nums.length-i-1;i++){
                if(nums[j]>nums[j+1]){
                    flag = true;
                    //交换
                }
            }
            if(!flag){
                break;
            }
        }
    }
    public static void main(String[] args){
        
    }
}

快排及其优化:快排是无序效率最高,有序如果形成树单支,效率最低

最坏时间复杂度:O(n^2),最好O(nlogn),平均(nlogn),不稳定的排序,因为后面的可能跑到前边去

//未优化版
public class FastSort{
    public static int partition(int[] nums,int start,int end){//int用于返回分割点的下标值
        int key = nums[start];
        int i=start,j=end;
        while(i<=j){
            while(i<j&&nums[j]>=key){j--;}
            nums[i] = nums[j];
            while(i<j&&nums[i]<=key){i++;}
            nums[j] = nums[i];
        }
        nums[j] = key;
        return j;
    }
    public static void qSort(int[] nums,int start,int end){
        if(start>=end){
            return;
        }
        int key = partion(nums,start,end);
        qSort(nums,start,key-1);
        qSort(nums,key+1,end);
    }
    public static void main(String[] args){
        int[] nums = {...};
        qSort(nums,0,nums.length-1);
    }
}

//优化版
public class FastSort{
    public static int partition(int[] nums,int start,int end){//int用于返回分割点的下标值
        //多加了个调整顺序
        int mid = start + (end - start)/2;        
        if(start<mid){
            //交换
        }
        if(end<mid){
            //交换
        }
        //这样中间最小,然后比较start和end
        if(end<start){
            //end中间,调整end到start
        }


        int key = nums[start];
        int i=start,j=end;
        while(i<=j){
            while(i<j&&nums[j]>=key){j--;}
            nums[i] = nums[j];
            while(i<j&&nums[i]<=key){i++;}
            nums[j] = nums[i];
        }
        nums[j] = key;
        return j;
    }
    public static void qSort(int[] nums,int start,int end){
        if(start>=end){
            return;
        }
        int key = partion(nums,start,end);
        qSort(nums,start,key-1);
        qSort(nums,key+1,end);
    }
    public static void main(String[] args){
        int[] nums = {...};
        qSort(nums,0,nums.length-1);
    }
}

希尔排序:时间复杂度不确定的排序

最坏时间复杂度:O(n^2) 最好时间复杂度O(n^1.3) 平均时间复杂度O(nlogn-n^2)  稳定性:不稳定的

public class ShellSort{
    public static void shellSort(int[] nums){
        if(nums==null||nums.length<=0){
            return 0;
        }
        int increment = nums.length/3 + 1;
        do{
            for(int j=increment;j<=nums.length-1;j++){
                for(int i=j;i>=increment;i-=increment){
                    if(nums[i]>nums[i-increment]){
                        //交换
                    }
                }
            }
            increment = increment/3 + 1;
        }while(increment>1);
    }
    public static void main(String[] args){
        
    }
}

堆排序:先构建堆,然后再调整

最坏时间复杂度:O(nlogn)   最好时间复杂度:O(nlogn)   平均时间复杂度:O(nlogn)   不稳定的

//堆排序以1开始,0索引元素不考虑  构造大根堆
public class HeapSort{
    public static void heapSort(int[] nums,int start,int end){
        for(int i=start;i*2<=end;i*=2){
            int j=i*2;
            if(j<end){
                j = nums[j+1]>nums[j]?j+1:j;
            }
            if(nums[i]<nums[j]){
                //交换
            }
            else{
                break;    
            }
        }
    }
    public static void main(String[] args){
        int[] nums = {...};
        //构建大根堆
        for(int i=(nums.length-1)/2;i>=1;i--){
            heapSort(nums,i,nums.length-1);
        }
        //元素排序
        for(int i=nums.length-1;i>1;i--){
            //swap nums[1] nums[i]
            
            //交换后重新构造大根堆
            heapSort(nums,1,i-1);

        }
    }
}

归并排序递归和非递归版

最坏时间复杂度:O(nlogn)   最好时间复杂度:O(nlogn)   平均时间复杂度:O(nlogn)   稳定的

public class MergeSort{
    public static void merge(int[] nums,int start,int mid,int end){
        int i = start;
        int j = mid + 1;
        int k = 0; 
        int[] temp = new int[end-start+1];
        while(i<=mid&&j<=end){
            if(nums[i]<=nums[j]){
                temp[k++] = nums[i++];
            }
            else{
                temp[k++] = nums[j++];
            }
        }
        while(i<=mid){
            temp[k++] = nums[i++];
        }
        while(j<=end){
            temp[k++] = nums[j++];
        }
        for(int d=start;d<=end;d++){
            nums[d] = temp[d-start];
        }
    }
    public static void mergeSort(int[] nums,int start,int end){
        if(start>=end){
            return;
        }
        int mid = (start+end) / 2;
        mergeSort(nums,0,mid);
        mergeSort(nums,mid+1,end);
        merger(nums,start,mid,end);
    }
    public static void main(String[] args){
        int[] nums = {...};
        mergeSort(nums,0,nums.length-1);
    }
}

//非递归版
public class MergeSort{
    public static void merge(int[] nums,int start,int mid,int end){
        int i = start;
        int j = mid + 1;
        int k = 0; 
        int[] temp = new int[end-start+1];
        while(i<=mid&&j<=end){
            if(nums[i]<=nums[j]){
                temp[k++] = nums[i++];
            }
            else{
                temp[k++] = nums[j++];
            }
        }
        while(i<=mid){
            temp[k++] = nums[i++];
        }
        while(j<=end){
            temp[k++] = nums[j++];
        }
        for(int d=start;d<=end;d++){
            nums[d] = temp[d-start];
        }
    }
    public static void mergeSort(int[] nums,int start,int end){
        int len = 1;
        while(len<nums.length){
            for(int i=0;i+len<nums.length;i=i+len*2){
                if(i+len*2-1<nums.length){
                    merge(nums,i,i+len-1,i+len*2-1);
                }
                else{
                    merge(nums,i,i+len-1,nums.length-1);
                }
            }
            len = len * 2;
        }
    }
    public static void main(String[] args){
        int[] nums = {...};
        mergeSort(nums,0,nums.length-1);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_27378875/article/details/81151844