冒泡排序,选择排序,插入排序,归并排序

 1.冒泡排序

冒泡排序的思想,将数组分为已排(右边)和未排(左边)两部分。排序时每次在未排部分从左向右一次比较相邻2个元素,如果左大于右则互换位置。

每次都是指针从左边第一个依次相邻比较,到指针指向倒数第二个未排结束比较。

    @Test
    //冒泡排序
    public void fun4(){
        int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,13,23};
        int left=0;//数组起始索引
        int right=arr.length-1;//数组末尾索引
        int temp=0;
        for(int i=right;i>left;i--){
            for(int j=left+1;j<=i;j++){
                if(arr[j-1]>arr[j]){
                    temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

 时间复杂度为O(n^2),(n为数组元素个数,复杂度为循环执行比较的次数);

2.选择排序

选择排序思想,将数组分为已排(左边)和未排(右边)两部分。排序时每次在待排部分选择一个最小值并与待排的第一个元素互换,然后已排部分向右扩充一个成员。

    @Test
    //选择排序
    public void fun5(){
        int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,73,23};
        int left=0;//数组起始索引
        int right=arr.length-1;//数组末尾索引
        for(int i=left;i<right;i++){
            int p=i;
            for(int j=i+1;j<=right;j++){
                if(arr[j]<arr[p]){
                    p=j;
                }
            }
            if(p!=i){
                int temp=arr[i];
                arr[i]=arr[p];
                arr[p]=temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }

 3.插入排序

插入排序,分为已排(左边)和未排(右边),排序开始时数组第一个元素为已排部分,右边为未排。

    @Test
    //插入排序
    public void fun6(){
        int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,73,23};
        int left=0;//数组起始索引
        int right=arr.length-1;//数组末尾索引
        for(int i=left+1;i<=right;i++){
            int val=arr[i];//取出待排的第一个
            int j=i;
            while(j >left && val<arr[j-1]){//将待排数据向左(已排数据)依次比较
                arr[j]=arr[j-1];//如果已排数据都大于待排数,将已排数据依次向右位移一位
                j--;
            }
            arr[j]=val;//直到跳出循环将缓存的待排数据放到位移后留下的空位
        }
        System.out.println(Arrays.toString(arr));
    }

 4.归并排序

public class MergeSort {
    //两路归并算法,两个排好序的子序列合并为一个子序列
    public void merge(int []a,int left,int mid,int right){
        int []tmp=new int[a.length];//辅助数组
        int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针

        while(p1<=mid && p2<=right){
            if(a[p1]<=a[p2])
                tmp[k++]=a[p1++];
            else
                tmp[k++]=a[p2++];
        }
        while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
        while(p2<=right) tmp[k++]=a[p2++];//同上

        //复制回原素组
        for (int i = left; i <=right; i++) 
            a[i]=tmp[i];
    }
    public void mergeSort(int [] a,int start,int end){
        if(start<end){//当子序列中只有一个元素时结束递归
            int mid=(start+end)/2;//划分子序列
            mergeSort(a, start, mid);//对左侧子序列进行递归排序
            mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
            merge(a, start, mid, end);//合并
        }
    }
    @Test
    public void test(){
        int[] a = { 49, 38, 65, 97, 76, 13, 27, 50 };
        mergeSort(a, 0, a.length-1);
        System.out.println("排好序的数组:");
        for (int e : a)
            System.out.print(e+" ");
    }
}

猜你喜欢

转载自www.cnblogs.com/mryangbo/p/10673480.html