十大经典排序算法 (一)

//交换数组中两元素位置
    public static void swap(int[] arr,int i,int j) {
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }

swap在下面排序算法中会用到,主要是省事。

冒泡排序

//冒泡排序
    public static void bubble(int[] nums) {
        int length=nums.length;
        boolean flag;
        for(int i=0;i<length;i++) {//排序的次数
            flag=true;
            for(int j=0;j<length-1-i;j++) {//参与排序的数据个数
                if(nums[j]>nums[j+1]){
                    swap(nums,j,j+1);
                    flag=false;
                }
            }
            if(flag){
                break;
            }
        }
    }

flag在一定程度上起到了优化的作用,如果排序一个有序数组【1,2,3,4,5,6】,这里只需要循环一次就退出排序;如果在一次排序中,没有发生值交换,就意味着这时数组已经有序。

选择排序

//选择排序
    public static  void sort(int[] nums) {
        for(int i=0;i<nums.length-1;i++) {
            int minIndex=i;
            for(int j=i+1;j<nums.length;j++) {
                if(nums[j]<nums[minIndex]){
                    minIndex=j;
                }
            }
            swap(nums,i,minIndex);
        }
    }

插入排序

//插入排序
   public static void selectSort(int[] nums){
        for(int i=1;i<nums.length;i++) {
            int temp=nums[i];
            int j=i;
            while(j>0&&temp<nums[j-1]){
                nums[j]=nums[j-1];
                j--;
            }
            if(i!=j){
                nums[j]=temp;
            }
        }
   }

希尔排序

//插入排序的改进版---希尔排序
    public static  void shell(int[] nums) {
        int step=nums.length/2;
        int temp;
        while(step>0) {
            for(int i=step;i<nums.length;i++){
                temp=nums[i];
                int j=i;
                while(j>=step&&nums[j-step]>temp) {
                    nums[j]=nums[j-step];
                    j-=step;
                }
                nums[j]=temp;
            }
            step=step/2;
        }
    }

归并排序

//归并排序,先分后合, mergeSort分 ,merge合并
    public static void mergeSort(int[] nums,int left,int right){
        if(left==right) return ;
        int mid=left+(right-left)/2;
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        merge(nums,left,mid,right);
    }
    private static void merge(int[] nums, int left, int mid, int right) {
        int[] helper=new int[right-left+1];//辅助数组
        int i=0;
        int l=left;
        int r=mid+1;
        while(l<=mid&&r<=right) {
            helper[i++] = nums[l]<nums[r]?nums[l++]:nums[r++];
        }
        while(l<=mid) {
            helper[i++] = nums[l++];
        }
        while(r<=right) {
            helper[i++] = nums[r++];
        }
        for(int j=0;j<helper.length;j++) {
            nums[left+j]=helper[j];
        }
    }

最后,使用归并排序为数组排序,验证:

public static void main(String[] args) {
        int[] nums={5,44,15,16,26,27,3,49,4,19,70,28};
        mergeSort(nums,0,nums.length-1);
        for(int num:nums){
            System.out.print(num+" ");
        }
    }
经验分享 程序员 微信小程序 职场和发展