elementUI radio 單選框獲取值有三種方法:
阿新 • • 發佈:2022-03-31
class Solution { public int[] sortArray(int[] nums) { // selectionSort(nums); // insertionSort(nums, 0, nums.length - 1); // shellSort(nums); quickSort(nums, 0, nums.length - 1);// 最快 // mergeSort(nums, 0, nums.length - 1, new int[nums.length]); // radixSort(nums); // 報錯,因為基數排序不支援排序負數 //heapSort(nums); return nums; } // 氣泡排序 O(n^2):可通過判斷一輪比較後沒有進行交換提前跳出來優化 void bubbleSort(int[] nums) { // 比較次數 for (int i = 0; i < nums.length - 1; i++) { // 每次比較需要遍歷的下標 for (int j = 0; j < nums.length - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums, j, j + 1); } } } } // 選擇排序 O(n^2) void selectionSort(int[] nums) { for (int i = 0; i < nums.length - 1; i++) { int minIndex = i; int min = nums[i]; for (int j = i + 1; j < nums.length; j++) { if (nums[j] < min) { min = nums[j]; minIndex = j; } } swap(nums, i, minIndex); } } // 插入排序 O(n^2) void insertionSort(int[] nums, int left, int right) { for (int i = left + 1; i <= right; i++) { int insertedVal = nums[i]; int insertedIndex = i - 1;// 待插入數前面數的下標 while (insertedIndex >= 0 && insertedVal < nums[insertedIndex]) { nums[insertedIndex + 1] = nums[insertedIndex]; insertedIndex--; } nums[insertedIndex + 1] = insertedVal; } } // 希爾排序 O(nlog^2(n)):增量分組 + 插入排序 void shellSort(int[] nums) { for (int gap = nums.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < nums.length; i++) { int insertedVal = nums[i]; int insertedIndex = i - gap; while (insertedIndex >= 0 && insertedVal < nums[insertedIndex]) { nums[insertedIndex + gap] = nums[insertedIndex]; insertedIndex -= gap; } nums[insertedIndex + gap] = insertedVal; } } } // 快速排序 O(nlog(n)):氣泡排序的改進 final int INSERTION_SORT_THRESHOLD = 7; void quickSort(int[] nums, int left, int right) { // 小於一定閾值換用插入排序 if (right - left <= INSERTION_SORT_THRESHOLD) { insertionSort(nums, left, right); return; } int pIndex = partition(nums, left, right); quickSort(nums, left, pIndex - 1); quickSort(nums, pIndex + 1, right); } Random random = new Random(); int partition(int[] nums, int left, int right) { int randomIndex = left + random.nextInt(right - left + 1); swap(nums, left, randomIndex); int pivot = nums[left]; int lt = left; for (int i = left + 1; i <= right; i++) { if (nums[i] < pivot) { lt++; swap(nums, i, lt); } } swap(nums, lt, left); return lt; } // 歸併排序 O(nlog(n)) void mergeSort(int[] nums, int left, int right, int[] tmp) { if (left >= right) { return; } int mid = left + (right - left) / 2; mergeSort(nums, left, mid, tmp); mergeSort(nums, mid + 1, right, tmp); merge(nums, left, right, tmp); } void merge(int[] nums, int left, int right, int[] tmp) { // 1. 合併到臨時陣列 int mid = left + (right - left) / 2; int i = left, j = mid + 1, t = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { tmp[t++] = nums[i++]; } else { tmp[t++] = nums[j++]; } } while (i <= mid) { tmp[t++] = nums[i++]; } while (j <= right) { tmp[t++] = nums[j++]; } // 2. 複製回原陣列 t = 0; i = left; while (i <= right) { nums[i++] = tmp[t++]; } } // 基數排序 O(n * bucketSum):空間換時間的經典演算法,不支援排序負數 void radixSort(int[] nums) { final int RADIX = 10; int[][] bucket = new int[RADIX][nums.length]; int[] bucketElementCount = new int[RADIX]; int max = nums[0]; for (int i = 0; i < nums.length; i++) { max = Math.max(max, nums[i]); } int maxDigit = ("" + max).length(); for (int i = 0, digit = 1; i < maxDigit; i++, digit *= 10) { for (int j = 0; j < nums.length; j++) { int digitElement = nums[j] / digit % 10; bucket[digitElement][bucketElementCount[digitElement]] = nums[j]; bucketElementCount[digitElement]++; } int index = 0; for (int k = 0; k < RADIX; k++) { for (int l = 0; l < bucketElementCount[k]; l++) { nums[index++] = bucket[k][l]; } bucketElementCount[k] = 0; } } } // 堆排序 O(nlog(n)) void heapSort(int[] nums) { for (int i = nums.length / 2 - 1; i >= 0; i--) { adjustHeap(nums, nums.length, i); } for (int i = nums.length - 1; i >= 0; i--) { swap(nums, i, 0); adjustHeap(nums, i, 0); } } void adjustHeap(int[] nums, int len, int nodeIndex) { int tmp = nums[nodeIndex]; for (int i = 2 * nodeIndex + 1; i < len; i = 2 * i + 1) { if (i + 1 < len && nums[i + 1] > nums[i]) { i++; } if (nums[i] > tmp) { nums[nodeIndex] = nums[i]; nodeIndex = i; } else { break; } } nums[nodeIndex] = tmp; } void swap(int[] nums, int a, int b) { int tmp = nums[a]; nums[a] = nums[b]; nums[b] = tmp; } } ```## 排序演算法總結 ```java class Solution { public int[] sortArray(int[] nums) { // selectionSort(nums); // insertionSort(nums, 0, nums.length - 1); // shellSort(nums); quickSort(nums, 0, nums.length - 1);// 最快 // mergeSort(nums, 0, nums.length - 1, new int[nums.length]); // radixSort(nums); // 報錯,因為基數排序不支援排序負數 //heapSort(nums); return nums; } // 氣泡排序 O(n^2):可通過判斷一輪比較後沒有進行交換提前跳出來優化 void bubbleSort(int[] nums) { // 比較次數 for (int i = 0; i < nums.length - 1; i++) { // 每次比較需要遍歷的下標 for (int j = 0; j < nums.length - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums, j, j + 1); } } } } // 選擇排序 O(n^2) void selectionSort(int[] nums) { for (int i = 0; i < nums.length - 1; i++) { int minIndex = i; int min = nums[i]; for (int j = i + 1; j < nums.length; j++) { if (nums[j] < min) { min = nums[j]; minIndex = j; } } swap(nums, i, minIndex); } } // 插入排序 O(n^2) void insertionSort(int[] nums, int left, int right) { for (int i = left + 1; i <= right; i++) { int insertedVal = nums[i]; int insertedIndex = i - 1;// 待插入數前面數的下標 while (insertedIndex >= 0 && insertedVal < nums[insertedIndex]) { nums[insertedIndex + 1] = nums[insertedIndex]; insertedIndex--; } nums[insertedIndex + 1] = insertedVal; } } // 希爾排序 O(nlog^2(n)):增量分組 + 插入排序 void shellSort(int[] nums) { for (int gap = nums.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < nums.length; i++) { int insertedVal = nums[i]; int insertedIndex = i - gap; while (insertedIndex >= 0 && insertedVal < nums[insertedIndex]) { nums[insertedIndex + gap] = nums[insertedIndex]; insertedIndex -= gap; } nums[insertedIndex + gap] = insertedVal; } } } // 快速排序 O(nlog(n)):氣泡排序的改進 final int INSERTION_SORT_THRESHOLD = 7; void quickSort(int[] nums, int left, int right) { // 小於一定閾值換用插入排序 if (right - left <= INSERTION_SORT_THRESHOLD) { insertionSort(nums, left, right); return; } int pIndex = partition(nums, left, right); quickSort(nums, left, pIndex - 1); quickSort(nums, pIndex + 1, right); } Random random = new Random(); int partition(int[] nums, int left, int right) { int randomIndex = left + random.nextInt(right - left + 1); swap(nums, left, randomIndex); int pivot = nums[left]; int lt = left; for (int i = left + 1; i <= right; i++) { if (nums[i] < pivot) { lt++; swap(nums, i, lt); } } swap(nums, lt, left); return lt; } // 歸併排序 O(nlog(n)) void mergeSort(int[] nums, int left, int right, int[] tmp) { if (left >= right) { return; } int mid = left + (right - left) / 2; mergeSort(nums, left, mid, tmp); mergeSort(nums, mid + 1, right, tmp); merge(nums, left, right, tmp); } void merge(int[] nums, int left, int right, int[] tmp) { // 1. 合併到臨時陣列 int mid = left + (right - left) / 2; int i = left, j = mid + 1, t = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { tmp[t++] = nums[i++]; } else { tmp[t++] = nums[j++]; } } while (i <= mid) { tmp[t++] = nums[i++]; } while (j <= right) { tmp[t++] = nums[j++]; } // 2. 複製回原陣列 t = 0; i = left; while (i <= right) { nums[i++] = tmp[t++]; } } // 基數排序 O(n * bucketSum):空間換時間的經典演算法,不支援排序負數 void radixSort(int[] nums) { final int RADIX = 10; int[][] bucket = new int[RADIX][nums.length]; int[] bucketElementCount = new int[RADIX]; int max = nums[0]; for (int i = 0; i < nums.length; i++) { max = Math.max(max, nums[i]); } int maxDigit = ("" + max).length(); for (int i = 0, digit = 1; i < maxDigit; i++, digit *= 10) { for (int j = 0; j < nums.length; j++) { int digitElement = nums[j] / digit % 10; bucket[digitElement][bucketElementCount[digitElement]] = nums[j]; bucketElementCount[digitElement]++; } int index = 0; for (int k = 0; k < RADIX; k++) { for (int l = 0; l < bucketElementCount[k]; l++) { nums[index++] = bucket[k][l]; } bucketElementCount[k] = 0; } } } // 堆排序 O(nlog(n)) void heapSort(int[] nums) { for (int i = nums.length / 2 - 1; i >= 0; i--) { adjustHeap(nums, nums.length, i); } for (int i = nums.length - 1; i >= 0; i--) { swap(nums, i, 0); adjustHeap(nums, i, 0); } } void adjustHeap(int[] nums, int len, int nodeIndex) { int tmp = nums[nodeIndex]; for (int i = 2 * nodeIndex + 1; i < len; i = 2 * i + 1) { if (i + 1 < len && nums[i + 1] > nums[i]) { i++; } if (nums[i] > tmp) { nums[nodeIndex] = nums[i]; nodeIndex = i; } else { break; } } nums[nodeIndex] = tmp; } void swap(int[] nums, int a, int b) { int tmp = nums[a]; nums[a] = nums[b]; nums[b] = tmp; } }