常見排序演算法 - Java語言實現
阿新 • • 發佈:2021-07-08
選擇排序
內層迴圈每次選擇最小元素(用索引表示),與陣列中未排序部分的首元素進行交換。
public void selectSort(int[] nums) { int N = nums.length; for (int i = 0; i < N; i++) { int min = i; // 最小值的索引 for (int j = i + 1; j < N; j++) { if (nums[j] < nums[min]) { min = j; } } exch(nums,i,min); } } public void exch(int[] nums,int a,int b){ int temp=nums[a]; nums[a]=nums[b]; nums[b]=temp; }
插入排序
內層迴圈每次從未排序部分中拿出一個元素,將其插入到已排序部分的合適位置。
public void insertSort(int[] nums){
int N=nums.length;
for (int i = 1; i < N; i++) {
for (int j = i; j >0 ; j--) {
if (nums[j]<nums[j-1]){
exch(nums,j,j-1);
}
}
}
}
快速排序
快速排序是選擇一個基準值,將陣列切分為小於等於它的左半部分和大於等於它的右半部分,以及基準值本身。然後遞迴呼叫排序方法,對左右子陣列進行排序。
分為3個步驟:切分 - 排序左子陣列 - 排序右子陣列
關鍵是切分,每次切分完成後,都會排定基準值的最終位置
public void quickSort(int[] nums) { sort(nums,0,nums.length-1); } private static void sort(int[] nums,int low,int high) { if(low >= high) { return; } // 切分 int j = partition(nums,low,high); // 排序左半部分 sort(nums,low,j - 1); // 排序右半部分 sort(nums,j + 1,high); } // 切分陣列,並確定切分元素的位置 // 隨意地取 a[lo] 作為切分元素,即那個將會被排定的元素; // 然後我們從陣列的左端開始向右掃描直到找到一個大於等於它的元素; // 再從陣列的右端開始向左掃描直到找到一個小於等於它的元素; // 這兩個元素顯然是沒有排定的,因此交換它們的位置 private static int partition(int[] nums,int low,int high) { int pivot = nums[low]; // 切分元素 int left = low, right = high+1; // 左右掃描指標 while(true) { // 從左往右掃描 while(nums[++left] < pivot) { if(left == high) { break; } } // 從右往左掃描 while(nums[--right] > pivot) { if(right == low) { break; } } // 左右指標相遇,掃描結束 if(left >= right) { break; } // 交換掃描到的2個元素 exch(nums,left,right); } // 將切分元素放到正確的位置 exch(nums,low,right); return right; }