常见排序算法

​[COT]

1、冒泡排序

import java.util.Random;

public class ownTest {
    //将数组 array 中 begin 和 end 两个位置的值交换
    public void swap(int[] array,int begin,int end){
        int temp;
        temp = array[begin];
        array[begin] = array[end];
        array[end] = temp;
    }

    public void showArray(int[] array,int begin,int end,boolean start){
        System.out.println("排序"+(start?"前:":"后:"));
        int count=0;
        for (int i=begin;i<=end;i++) {
            System.out.print(array[i]+"\t");
            if (++count%10==0) {
                System.out.println();
            }
        }
    }
    public int[] getRandArray(int size){
        Random rand = new Random();
        final int SEED =13;//随便赋值
        int[] array =new int[size];
        for (int i = 0; i < array.length; i++) {
            array[i]=rand.nextInt(size*SEED);
        }
        return  array;
    }

    //冒泡排序
    public void _bubbleSort(int[] array,int begin,int end){
        //控制比较的轮次
        for (begin=0;begin<end;end--){
            //控制每轮比较次数
            for (int j=begin;j<end;j++){
                if (array[j]>array[j+1]){
                    swap(array,j,j+1);
                }
            }
        }
    }
    public void bubbleSort(int[] array,int begin,int end){
        showArray(array,begin,end,true);
        _bubbleSort(array,begin,end);
        showArray(array,begin,end,true);
    }
    
    public static void main(String[] args) {
        ownTest a = new ownTest();
        int[] array = a.getRandArray(10);
        a.bubbleSort(array,0,array.length-1);
    }
}

 


2、选择排序

public void selectSort(int[] array,int begin,int end){
    //控制比较的轮次
    for (int maxValIx;begin<end;end--){
        maxValIx=begin;
        //控制每轮比较次数
        for (int j=begin+1;j<=end;j++){    //不用和自己比,得走到最后一个位置才可
            if (array[j]>array[maxValIx]){
                maxValIx=j;
            }
        }
        //如果最大值没有出现在最大位置,则交换
        if (maxValIx!=end){
            swap(array,maxValIx,end);
        }
    }
}

public void _insertSort(int[] array,int begin,int end){
    for (int i = begin+1,t,j; i <=end ; i++) {
        t=array[i];
        if (t>=array[i]) continue;
        for (j=i-1;j>=begin&&array[j]>t;j--){
            array[j+1]=array[j];
        }
        array[j+1]=t;
    }
}

3、插入排序

public void _insertSort(int[] array,int begin,int end){
    for (int i = begin+1,t,j; i <=end ; i++) {    /end是下标,不是长度
        t=array[i];
        //当前位置左侧有序,如果当前位置的值比左侧第一位大,向后走一步
        if (t>=array[i])continue;
        //否则向左移找到一个比当前小的值所在位置,所有比当前位置大的都右移一位
        for (j =i-1;j>=begin && array[j]>t ;j--){//如果array[j]当中存在比t大的值
            array[j+1] = array[j];
        }
        //最后将值插入该位置右边一位
        array[j+1]=t;
    }
}
public void insertSort(int[] array,int begin,int end){
    showArray(array,begin,end,true);
    _insertSort(array,begin,end);
    showArray(array,begin,end,false);
}


4、希尔排序

//希尔排序
public void hillSort(int[] array,int begin,int end){
    showArray(array,begin,end,true);
    int step = (end - begin +1)/2 ; //0-5共6个元素 中间是
    while (step>=1){
        for (int i = begin; i +step<=end; i++) { //i+step的值不能越界
            if (array[i] > array[i+step]) {
                swap (array,i,i+step);
            }
        }
        step /=2;
    }
    _insertSort(array,begin,end);
    showArray(array,begin,end,false);
}

 


5、快速排序(掌握)

快速排序(不稳定,如果第一个是最小的情况的话,分不出来)
详情看:1.6 快速排序 | 菜鸟教程 (runoob.com)
//找到begin和end相遇的下标。
private int mid(int[] array,int begin,int end){
    int mid = begin;
    while (begin<end){
        while (begin<end && array[end]>=array[mid]) end--;
        while (begin<end && array[begin]<=array[mid]) begin++;
        //当两个循环结束(左边较小的,右边较大的)还没出现等于,交换
        if (begin<end) {
            swap(array, begin, end);
        }
    }
    if (mid != begin){//begin和end一样大
        swap(array,mid,begin);
    }
    return begin;
}

public void _quickSort(int[] array,int begin,int end){
    if (begin>= end) {
        return;
    }
    int mid = mid(array,begin,end);
    _quickSort(array,begin,mid-1);
    _quickSort(array,mid+1,end);
}

public void quickSort(int[] array,int begin,int end){
    showArray(array,begin,end,true);
    _quickSort(array, begin, end);
    showArray(array,begin,end,false);
}

 


6、归并排序(掌握)

详情看:归并排序 | 菜鸟教程 (runoob.com)

//因为会不断返回一个新数组
private int[] _mergeSort(int[]array,int begin, int end){
    if (end-begin==0){
        return new int[]{array[begin]};//begin和end都一样的
    }
    int m =begin + (end - begin)/2,l=0,r=0;//中间的下标m =(end + begin)/2;可能会越界
    int[] left = _mergeSort(array,begin,m);
    int[] right = _mergeSort(array,m+1,end);
    //先拆成一个一个,再归并回去
    //定义一个两个下标加起来的数组
    int[] temp = new int[left.length+right.length];
    m=0;
    while (l<left.length && r<right.length){
        temp[m++] = left[l]<right[r]?left[l++]:right[r++];
    }
    while (l<left.length){ temp[m++] = left[l++]; }
    while (r<right.length) { temp[m++] = right[r++]; }
    return temp;
}

public int[] mergeSort(int[] array,int begin,int end){
    showArray(array,begin,end,true);
    array=_mergeSort(array, begin, end);
    showArray(array,begin,end,false);
    return array;
}

 

posted @ 2022-03-13 13:39  北极光zzZ  阅读(36)  评论(0)    收藏  举报