1. 程式人生 > 資訊 >17 個改變世界的數學公式,馬斯克選出了自己最喜歡的一個

17 個改變世界的數學公式,馬斯克選出了自己最喜歡的一個

​[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;
}