冒泡、快速、選擇、插入演算法
阿新 • • 發佈:2020-09-16
冒泡
public void sortedList1(int[] arr) { int tmp; for (int i = 0; i < arr.length; i++) { for (int j = i + 1; j < arr.length; j++) { if (arr[i] > arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j]= tmp; } } } }
快速
/** * @param arr 排列的陣列 * @param left 當前排列陣列片段的最左下標 * @param right 當前排列陣列片段的最右下標 * @param tmp 預設右邊下標先判斷,則tmp取最左下標值arr[left] */ public void sortedList2(int[] arr, int left, int right, int tmp) { intstart = left; //記錄當前需要排序陣列片段起點下標 int end = right; //記錄當前需要排序陣列片段終止下標 int pos = 1; //1:當前由right指標判斷(預設), 0:當前由left指標判斷 while (left != right) { if (pos == 1) { if (arr[right] < tmp) { arr[left] = arr[right]; //陣列左端下標賦值 left++; //左下標往左移一位 pos = 0; //切換為left指標判斷 } else { //右下標繼續移動 right--; } } else { if (arr[left] > tmp) { arr[right] = arr[left]; //陣列右端下標賦值 right--; //右下標往右移一位 pos = 1; //切換為right指標判斷 } else { //左下標繼續移動 left++; } } } // 跳出迴圈,此時left、right指向同一下標,left = right,取哪個都行 arr[left] = tmp; //已經定位tmp值的位置,即下標為left(right) // 以left(right)下標作為分割點,進行下面的判斷 if (left - start > 1) { // 左邊陣列片段長度大於1,繼續快排 sortedList2(arr, start, left - 1, arr[start]); } if (end - left > 1) { // 右邊陣列片段長度大於1,繼續快排 sortedList2(arr, left + 1, end, arr[left + 1]); } }
思路
https://blog.csdn.net/qq_40595682/article/details/102146917
選擇
// 選擇排序,改進了冒泡,減少了交換的次數 public void sortedList3(int[] arr) { int minIdx; //記錄最小值下標 int tmp; //交換暫存變數 for (int i = 0; i < arr.length; i++) { minIdx = i; // 預設取到的第一個為最小值 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIdx]) { minIdx = j; //重新記錄最小值下標 } } if (minIdx != i) { //最小值不是第一個,則交換 tmp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = tmp; } } }
插入
public void sortedList4(int[] arr) { int tmp; for (int i = 1; i < arr.length; i++) { tmp = arr[i]; //需要插入的值 for (int k = i; k > 0; k--) { if(arr[k-1] > tmp){ arr[k] = arr[k-1]; //向後移動一位 if (k==1) //此時tmp是最小值,已經移動到了arr[1],且此時arr[0]=arr[1] arr[k-1] = tmp; // arr[0]賦值 }else if (arr[k-1] < tmp){ if (k != i) //如果k == i 此時的tmp剛好比前面的值都大,無需移動,直接跳出迴圈 arr[k] = tmp; break; } } } }
思路