java 快速排序 插入排序 選擇排序
阿新 • • 發佈:2019-02-02
package 未做_快速排序_歸併排序_二分查詢_等排序; /* * 快速排序 * 使用遞迴方法 * 把陣列拆分為兩個子陣列加上一個基準元素: * 1.選取最後一個元素作為基準元素,index變數記錄最近一個小於基準元素的元素所在的位置, * 初始化為start- 1,發現新的小於基準元素的元素,index加1。 * 從第一個元素到倒數第二個元素,依次與基準元素比較, * 小於基準元素,index加1,交換位置index和當前位置的元素。 * 迴圈結束之後index+1得到基準元素應該在的位置,交換index+1和最後一個元素。 * 2.分別排序[start, index], 和[index+2, end]兩個子陣列 * */ public class QuickSort { public static void main(String args[]){ int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 }; quictSort(arr); print(arr); } public static void print(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]); System.out.print(","); } } public static void jiaohuan(int[] arr, int index1, int index2){ int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } public static void quictSort(int[] arr){ quictSort(arr, 0 , arr.length-1); } public static void quictSort(int[] arr, int start, int end){ if(arr == null || end<2){ return ;//若只有1個元素或沒有元素,沒必要排序,停止程式 } int part = partition(arr, start , end);//求基準元素應該所在的位置 if(part == start){ quictSort(arr, part+1, end);//遞迴處理 part之後的陣列元素 }else if(part == end){ quictSort(arr, start, part-1);//遞迴處理 part之前的陣列元素 }else{ quictSort(arr, start, part-1);//遞迴處理 part之前的陣列元素 quictSort(arr, part+1, end);//遞迴處理 part之後的陣列元素 } } public static int partition(int[] arr, int start, int end){ int value = arr[end];//選取最後一個元素為基準元素 int index = start-1;//為了從start---end-1 進行比較 每次index+1; for(int i=start; i<end; i++){ if(arr[i]<value){//若元素小於最後一個元素的值 則index +1 繼續向前走 index++; if(index != i){//交換當前index 與i位置的值 jiaohuan(arr, index, i); } } } if((index+1) != end ){ jiaohuan(arr, index+1, end); } return index+1;//得到基準元素所在的位置 } }
package 未做_快速排序_歸併排序_二分查詢_等排序; /* 插入排序 * 升序 * 1.選取第一個元素為基準元素 * 2.若第二個元素小於基準元素,則把第二個元素插入到第一個元素的前面,把第二個元素作為基準元素 * 3.直到所有元素插入為止 */ public class insertSort { public static void main(String args[]){ int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 }; Sort(arr); print(arr); } public static void Sort(int[] arr){ if(arr == null || arr.length<2){ return ; } for(int i=1;i<arr.length;i++){ //從第i個元素開始與i之前的元素進行比較 若當前元素小於i之前的元素 則進行交換值,直到交換到第0個元素為止 int value = arr[i]; int position = i;//記錄當前元素的位置 for(int j=i-1;j>=0;j--){ if(arr[j]>value){ arr[j+1]=arr[j];//若當前值前面的值大於當前值,則把前面的值賦給後面的值 position-=1;//記錄value應該在的位置 }else{ break; } } arr[position] = value;//把當前值放在當前位置上 } } public static void print(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]); System.out.print(","); } } }
package 未做_快速排序_歸併排序_二分查詢_等排序; //選擇排序 public class SelectSort { public static void main(String args[]){ int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 }; Sort(arr); print(arr); } public static void Sort(int[] a) { if (a == null || a.length <= 0) { return; } for (int i = 0; i < a.length; i++) { int min = i; /* 將當前下標定義為最小值下標 */ for (int j = i + 1; j < a.length; j++) { if (a[min] > a[j]) { /* 如果有小於當前最小值的關鍵字 */ min = j; /* 將此關鍵字的下標賦值給min */ } } if (i != min) {/* 若min不等於i,說明找到最小值,交換 */ int tmp = a[min]; a[min] = a[i]; a[i] = tmp; } } } public static void print(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]); System.out.print(","); } } }