17 個改變世界的數學公式,馬斯克選出了自己最喜歡的一個
阿新 • • 發佈:2022-03-09
[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、快速排序(掌握)
快速排序(不穩定,如果第一個是最小的情況的話,分不出來)
詳情看:
//找到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、歸併排序(掌握)
詳情看:
//因為會不斷返回一個新陣列 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; }