(五)冒泡排序 & 归并算法

一. 冒泡排序

  • 基本思想:从第一个数开始逐个往后比较,保证最小的数在最前面
  • 复杂度:O(N*N)
  • 实现:
/**
     * 排序方法:冒泡排序
     * 复杂度:O(N*N)
     * 特点:挨个往后冒,不符合规则则交换
     * */
    public static void maoPao(ArrayList<Integer>arrayList){
        for(int i=0;i<arrayList.size();i++){
            int needToMin = arrayList.get(i);
            for(int j=i+1;j<arrayList.size();j++){
                int needToComp = arrayList.get(j);
                if(needToMin>needToComp){
                    int temp =arrayList.get(i);
                    arrayList.set(i, arrayList.get(j));
                    arrayList.set(j, temp);
                    needToMin = arrayList.get(i);
                }
            }
        }
    }

二. 归并排序

  • 基本思想:将数组分成2组A,B,对于A,B两组再各自分成2组,直到分出来的小组只有1个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的2个小组就可以了。从而实现通过局部有序达到全局有序。
  • 复杂度:O(N*logN)
  • 实现:
public class Example{
    public static void divide(int[] arr,int start,int end){
        //递归的终止条件: 即分到不可再分
        if(start >= end) {
            return;
        }

        //计算中间值
        int mid = start + (end - start)/2;

        //递归分直到单个数据
        divide(arr,start,mid);
        divide(arr,mid+1,end);

        //治:从单个数据合并为一个整体
        merge(arr,start,mid,end);
    }

    public static void merge(int[] arr,int start,int mid,int end){
        // 合并后的数组
        int[] temp = new int[end-start+1];

        //存一下变量
        int i=start,j=mid+1,k=0;
        //下面就开始两两进行比较,若前面的数大于后面的数,就构成逆序对
        while(i<=mid && j<=end){
            //若前面小于后面,直接存进去,并且移动前面数所在的数组的指针即可
            if(arr[i] <= arr[j]){
                temp[k++] = arr[i++];
            }else{
                temp[k++] = arr[j++];
            }
        }

        //各自还有剩余的没比完,直接赋值即可
        while(i<=mid) {
            temp[k++] = arr[i++];
        }
        while(j<=end) {
            temp[k++] = arr[j++];
        }
        //覆盖原数组
        for (k = 0; k < temp.length; k++) {
            arr[start + k] = temp[k];
        }
    }


    public static void main(String[] args) {
        int[]str=new  int[]{123,13,43,23,2};
        System.out.println("排序前:");
        for(int i=0;i<str.length;i++){
            System.out.print(str[i]+" ");
        }
        System.out.println();
        divide(str, 0, str.length-1);
        System.out.println("归并排序后:");
        for(int i=0;i<str.length;i++){
            System.out.print(str[i]+" ");
        }
        System.out.println();
    }
}

猜你喜欢

转载自www.cnblogs.com/huaiheng/p/12920036.html
今日推荐