各种排序方法

有各种排序的方法

插入排序 折半插入 冒泡 快速 堆 基数 希尔排序 归并 选择

package com.company;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Sort {
    // 插入排序
    void insert(int[] nums){
        for(int i=1;i<nums.length;i++){
            int value = nums[i];
            for(int j=0;j<i;j++){
                if(value<nums[j]){
                    for(int k=i;k>j;k--){
                        nums[k] = nums[k-1];
                    }
                    nums[j] = value;
                    break;
                }
            }
        }
    }
    // 折半查找排序
    void binSearch(int[] nums){
        for(int i=1;i<nums.length;i++){
            int value = nums[i];
            int start = 0,end = i-1;
            while (start<=end){
                int mid = (start+end)/2;
                if(nums[mid]>value){
                    end = mid -1;
                }else {
                    start = mid + 1;
                }
            }
            for(int k=i-1;k>end;k--){
                nums[k+1] = nums[k];
            }
            nums[end+1] = value;
        }
    }
    // 希尔选择排序
    void shellSelectSort(int[] nums){
        for(int skip=nums.length/2;skip>0;skip = skip/2){
            for (int i = 0;i<nums.length;i++){
                int minI = 0;
                int minValue = Integer.MAX_VALUE;
                for(int j = i;j<nums.length;j+=skip){
                    if(minValue>nums[j]){
                        minValue = nums[j];
                        minI = j;
                    }
                }
                nums[minI] = nums[i];
                nums[i] = minValue;
            }
        }
    }
    // 希尔冒泡排序
    void shellSort(int[] nums){
        for(int skip=nums.length/2;skip>0;skip/=2){
            for(int i=skip;i<nums.length;i++){
                for(int j=i;j>=skip;j-=skip){
                    if(nums[j]<nums[j-skip]){
                        int temp = nums[j];
                        nums[j] = nums[j-skip];
                        nums[j-skip]=temp;
                    }
                }
            }
        }
    }
    // 选择排序
    void selectSort(int[] nums){
        for(int i=0;i<nums.length;i++){
            int min = 0;
            int minValue = Integer.MAX_VALUE;
            for(int j=i;j<nums.length;j++){
                if(minValue>nums[j]){
                    minValue = nums[j];
                    min = j;
                }
            }
            nums[min] = nums[i];
            nums[i] = minValue;
        }
    }
    // 冒泡排序
    void bubbleSort(int[] nums){
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<nums.length-i-1;j++){
                if(nums[j+1]<nums[j]){
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
    }
    // QuickSort
    void quickSort(int[] nums,int start,int end){
        if(start>=end){
            return;
        }
        int flagValue=nums[start];
        int flagIndex = start;
        for(int i=start+1;i<end;i++){
            if(nums[i]<flagValue){
                nums[flagIndex] = nums[i];
                flagIndex++;
                nums[i] = nums[flagIndex];
            }
        }
        nums[flagIndex] = flagValue;
        quickSort(nums,start,flagIndex);
        quickSort(nums,flagIndex+1,end);
    }
    public void swap(int[] nums,int i,int j){
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
    public void adjustBiggerHeap(int[] nums,int i,int size){
        int left = 2*i+1;
        int right = 2*i+2;
        if(left>=size){
            return;
        }
        if(nums[left]>nums[i]){ // 顶堆调整 那么他之后的顶堆也需要调整
            swap(nums,i,left);
            adjustBiggerHeap(nums,left,size);
        }
        if(right<size){
            if(nums[right]>nums[i]){
                swap(nums,i,right);
                adjustBiggerHeap(nums,right,size);
            }
        }
    }
    // heapSort 堆排序
    public void heapSort(int[] nums){
        // 把数组看成二叉树
       for (int i = nums.length/2;i>=0;i--){
           adjustBiggerHeap(nums,i,nums.length);
       }
       // 排序
        for(int i=nums.length-1;i>0;i--){
            swap(nums,i,0);
            adjustBiggerHeap(nums,0,i);
        }
    }
    public void  merge(int[] nums,int j,int leftStart,int leftEnd,int rightStart,int rightEnd){
        int[] book = new int[nums.length];
        int k = 0;
        while (leftStart<leftEnd&&rightStart<rightEnd){
            if(nums[leftStart]<nums[rightStart]){
                book[k] = nums[leftStart];
                leftStart++;
            }else {
                book[k] = nums[rightStart];
                rightStart++;
            }
            k++;
        }
        while (leftStart<leftEnd){
            book[k] = nums[leftStart];
            leftStart++;
            k++;
        }
        while (rightStart<rightEnd){
            book[k] = nums[rightStart];
            rightStart++;
            k++;
        }
        for(int n = 0;n<k;n++){
            nums[j+n] = book[n];
        }
    }
    public void mergeSort(int[] nums){
        int leftStart,leftEnd,rightEnd,rightStart;
        for(int i=1;i<nums.length;i*=2){
            for(int j=0;j<nums.length;j+=2*i){
                leftStart = j;
                leftEnd = rightStart = Math.min(nums.length,j+i);
                rightEnd = Math.min(nums.length,j+i+i);
                merge(nums,j,leftStart,leftEnd,rightStart,rightEnd);
            }
        }
    }

    // 基数排序
    public void baseSort(int[] nums){
        List<List<Integer>> bucket = new ArrayList<>();
        for(int i=0;i<10;i++){
            bucket.add(new LinkedList<>());
        }
        int countNum = 1;
        boolean flag = true;
        while (flag){
            int count = 1;
            for(int i=0;i<countNum;i++){
                count *= 10;
            }
            countNum++;
            for (int num : nums) {
                bucket.get(num % count / (count/10)).add(num);
            }
            int index = 0;
            for(List<Integer> list:bucket){
                for(int temp:list){
                    nums[index] = temp;
                    index++;
                }
                if(list.size()==nums.length){
                    return;
                }
                list.clear();
            }
        }
    }

}
class TestSort{
    public static void main(String[] args) {
        int[] nums = {8,12,4,54,9,4,3,6,1,2,1};
        System.out.println(Arrays.toString(nums));

        Sort sort = new Sort();
        sort.baseSort(nums);
        System.out.println(Arrays.toString(nums));
    }
}

上一篇:java_连续输入[1,2,5,9,5,9,5,5,5]


下一篇:iOS UIimage初始化时的两种方法