This commit is contained in:
krahets
2024-04-13 21:17:44 +08:00
parent 9332a91e26
commit 6afa70e7bc
55 changed files with 334 additions and 182 deletions

View File

@ -264,7 +264,9 @@ comments: true
for (j in 0..<i) {
if (nums[j] > nums[j + 1]) {
// 交換 nums[j] 與 nums[j + 1]
nums[j] = nums[j + 1].also { nums[j + 1] = nums[j] }
val temp = nums[j]
nums[j] = nums[j + 1]
nums[j + 1] = temp
}
}
}
@ -571,7 +573,9 @@ comments: true
for (j in 0..<i) {
if (nums[j] > nums[j + 1]) {
// 交換 nums[j] 與 nums[j + 1]
nums[j] = nums[j + 1].also { nums[j] = nums[j + 1] }
val temp = nums[j]
nums[j] = nums[j + 1]
nums[j + 1] = temp
flag = true // 記錄交換元素
}
}

View File

@ -553,7 +553,9 @@ comments: true
if (ma == i)
break
// 交換兩節點
nums[i] = nums[ma].also { nums[ma] = nums[i] }
val temp = nums[i]
nums[i] = nums[ma]
nums[ma] = temp
// 迴圈向下堆積化
i = ma
}
@ -568,7 +570,9 @@ comments: true
// 從堆積中提取最大元素,迴圈 n-1 輪
for (i in nums.size - 1 downTo 1) {
// 交換根節點與最右葉節點(交換首元素與尾元素)
nums[0] = nums[i].also { nums[i] = nums[0] }
val temp = nums[0]
nums[0] = nums[i]
nums[i] = temp
// 以根節點為起點,從頂至底進行堆積化
siftDown(nums, i, 0)
}

View File

@ -253,7 +253,21 @@ comments: true
=== "Ruby"
```ruby title="insertion_sort.rb"
[class]{}-[func]{insertion_sort}
### 插入排序 ###
def insertion_sort(nums)
n = nums.length
# 外迴圈:已排序區間為 [0, i-1]
for i in 1...n
base = nums[i]
j = i - 1
# 內迴圈:將 base 插入到已排序區間 [0, i-1] 中的正確位置
while j >= 0 && nums[j] > base
nums[j + 1] = nums[j] # 將 nums[j] 向右移動一位
j -= 1
end
nums[j + 1] = base # 將 base 賦值到正確位置
end
end
```
=== "Zig"

View File

@ -302,19 +302,16 @@ comments: true
nums[j] = tmp;
}
/* 快速排序類別 */
// 快速排序類別-哨兵劃分
/* 哨兵劃分 */
int partition(int nums[], int left, int right) {
// 以 nums[left] 為基準數
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= nums[left]) {
// 從右向左找首個小於基準數的元素
j--;
j--; // 從右向左找首個小於基準數的元素
}
while (i < j && nums[i] <= nums[left]) {
// 從左向右找首個大於基準數的元素
i++;
i++; // 從左向右找首個大於基準數的元素
}
// 交換這兩個元素
swap(nums, i, j);
@ -331,7 +328,9 @@ comments: true
```kotlin title="quick_sort.kt"
/* 元素交換 */
fun swap(nums: IntArray, i: Int, j: Int) {
nums[i] = nums[j].also { nums[j] = nums[i] }
val temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
}
/* 哨兵劃分 */
@ -563,30 +562,7 @@ comments: true
=== "C"
```c title="quick_sort.c"
/* 快速排序類別 */
// 快速排序類別-哨兵劃分
int partition(int nums[], int left, int right) {
// 以 nums[left] 為基準數
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= nums[left]) {
// 從右向左找首個小於基準數的元素
j--;
}
while (i < j && nums[i] <= nums[left]) {
// 從左向右找首個大於基準數的元素
i++;
}
// 交換這兩個元素
swap(nums, i, j);
}
// 將基準數交換至兩子陣列的分界線
swap(nums, i, left);
// 返回基準數的索引
return i;
}
// 快速排序類別-快速排序
/* 快速排序 */
void quickSort(int nums[], int left, int right) {
// 子陣列長度為 1 時終止遞迴
if (left >= right) {
@ -1022,8 +998,7 @@ comments: true
=== "C"
```c title="quick_sort.c"
/* 快速排序類別(中位基準數最佳化) */
// 選取三個候選元素的中位數
/* 選取三個候選元素的中位數 */
int medianThree(int nums[], int left, int mid, int right) {
int l = nums[left], m = nums[mid], r = nums[right];
if ((l <= m && m <= r) || (r <= m && m <= l))
@ -1033,7 +1008,7 @@ comments: true
return right;
}
/* 哨兵劃分(三數取中值) */
/* 哨兵劃分(三數取中值) */
int partitionMedian(int nums[], int left, int right) {
// 選取三個候選元素的中位數
int med = medianThree(nums, left, (left + right) / 2, right);
@ -1354,8 +1329,7 @@ comments: true
=== "C"
```c title="quick_sort.c"
/* 快速排序類別(尾遞迴最佳化) */
// 快速排序(尾遞迴最佳化)
/* 快速排序(尾遞迴最佳化) */
void quickSortTailCall(int nums[], int left, int right) {
// 子陣列長度為 1 時終止
while (left < right) {
@ -1363,11 +1337,15 @@ comments: true
int pivot = partition(nums, left, right);
// 對兩個子陣列中較短的那個執行快速排序
if (pivot - left < right - pivot) {
quickSortTailCall(nums, left, pivot - 1); // 遞迴排序左子陣列
left = pivot + 1; // 剩餘未排序區間為 [pivot + 1, right]
// 遞迴排序左子陣列
quickSortTailCall(nums, left, pivot - 1);
// 剩餘未排序區間為 [pivot + 1, right]
left = pivot + 1;
} else {
quickSortTailCall(nums, pivot + 1, right); // 遞迴排序右子陣列
right = pivot - 1; // 剩餘未排序區間為 [left, pivot - 1]
// 遞迴排序右子陣列
quickSortTailCall(nums, pivot + 1, right);
// 剩餘未排序區間為 [left, pivot - 1]
right = pivot - 1;
}
}
}

View File

@ -296,7 +296,9 @@ comments: true
k = j // 記錄最小元素的索引
}
// 將該最小元素與未排序區間的首個元素交換
nums[i] = nums[k].also { nums[k] = nums[i] }
val temp = nums[i]
nums[i] = nums[k]
nums[k] = temp
}
}
```