Re-translate the Japanese version (#1871)

* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
This commit is contained in:
Yudong Jin
2026-03-30 07:30:15 +08:00
committed by GitHub
parent fe6443235b
commit d7b2277d2b
1444 changed files with 83312 additions and 8363 deletions
@@ -0,0 +1,51 @@
/**
* File: bubble_sort.swift
* Created Time: 2023-01-29
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func bubbleSort(nums: inout [Int]) {
// [0, i]
for i in nums.indices.dropFirst().reversed() {
// [0, i]
for j in 0 ..< i {
if nums[j] > nums[j + 1] {
// nums[j] nums[j + 1]
nums.swapAt(j, j + 1)
}
}
}
}
/* */
func bubbleSortWithFlag(nums: inout [Int]) {
// [0, i]
for i in nums.indices.dropFirst().reversed() {
var flag = false //
for j in 0 ..< i {
if nums[j] > nums[j + 1] {
// nums[j] nums[j + 1]
nums.swapAt(j, j + 1)
flag = true //
}
}
if !flag { //
break
}
}
}
@main
enum BubbleSort {
/* Driver Code */
static func main() {
var nums = [4, 1, 3, 1, 5, 2]
bubbleSort(nums: &nums)
print("バブルソート完了後 nums = \(nums)")
var nums1 = [4, 1, 3, 1, 5, 2]
bubbleSortWithFlag(nums: &nums1)
print("バブルソート完了後 nums1 = \(nums1)")
}
}
@@ -0,0 +1,43 @@
/**
* File: bucket_sort.swift
* Created Time: 2023-03-27
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func bucketSort(nums: inout [Double]) {
// k = n/2 2
let k = nums.count / 2
var buckets = (0 ..< k).map { _ in [Double]() }
// 1.
for num in nums {
// [0, 1) num * k [0, k-1]
let i = Int(num * Double(k))
// num i
buckets[i].append(num)
}
// 2.
for i in buckets.indices {
// 使
buckets[i].sort()
}
// 3.
var i = nums.startIndex
for bucket in buckets {
for num in bucket {
nums[i] = num
i += 1
}
}
}
@main
enum BucketSort {
/* Driver Code */
static func main() {
// [0, 1)
var nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37]
bucketSort(nums: &nums)
print("バケットソート完了後 nums = \(nums)")
}
}
@@ -0,0 +1,70 @@
/**
* File: counting_sort.swift
* Created Time: 2023-03-22
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
// 使
func countingSortNaive(nums: inout [Int]) {
// 1. m
let m = nums.max()!
// 2.
// counter[num] num
var counter = Array(repeating: 0, count: m + 1)
for num in nums {
counter[num] += 1
}
// 3. counter nums
var i = 0
for num in 0 ..< m + 1 {
for _ in 0 ..< counter[num] {
nums[i] = num
i += 1
}
}
}
/* */
//
func countingSort(nums: inout [Int]) {
// 1. m
let m = nums.max()!
// 2.
// counter[num] num
var counter = Array(repeating: 0, count: m + 1)
for num in nums {
counter[num] += 1
}
// 3. counter
// counter[num]-1 num res
for i in 0 ..< m {
counter[i + 1] += counter[i]
}
// 4. nums res
// res
var res = Array(repeating: 0, count: nums.count)
for i in nums.indices.reversed() {
let num = nums[i]
res[counter[num] - 1] = num // num
counter[num] -= 1 // 1 num
}
// res nums
for i in nums.indices {
nums[i] = res[i]
}
}
@main
enum CountingSort {
/* Driver Code */
static func main() {
var nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]
countingSortNaive(nums: &nums)
print("カウントソート(オブジェクトはソート不可)完了後 nums = \(nums)")
var nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]
countingSort(nums: &nums1)
print("カウントソート完了後 nums1 = \(nums1)")
}
}
@@ -0,0 +1,55 @@
/**
* File: heap_sort.swift
* Created Time: 2023-05-28
* Author: nuomi1 (nuomi1@qq.com)
*/
/* n i */
func siftDown(nums: inout [Int], n: Int, i: Int) {
var i = i
while true {
// i, l, r ma
let l = 2 * i + 1
let r = 2 * i + 2
var ma = i
if l < n, nums[l] > nums[ma] {
ma = l
}
if r < n, nums[r] > nums[ma] {
ma = r
}
// i l, r
if ma == i {
break
}
// 2
nums.swapAt(i, ma)
//
i = ma
}
}
/* */
func heapSort(nums: inout [Int]) {
//
for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {
siftDown(nums: &nums, n: nums.count, i: i)
}
// n-1
for i in nums.indices.dropFirst().reversed() {
//
nums.swapAt(0, i)
//
siftDown(nums: &nums, n: i, i: 0)
}
}
@main
enum HeapSort {
/* Driver Code */
static func main() {
var nums = [4, 1, 3, 1, 5, 2]
heapSort(nums: &nums)
print("ヒープソート完了後 nums = \(nums)")
}
}
@@ -0,0 +1,30 @@
/**
* File: insertion_sort.swift
* Created Time: 2023-01-29
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func insertionSort(nums: inout [Int]) {
// [0, i-1]
for i in nums.indices.dropFirst() {
let base = nums[i]
var j = i - 1
// : base [0, i-1]
while j >= 0, nums[j] > base {
nums[j + 1] = nums[j] // nums[j] 1
j -= 1
}
nums[j + 1] = base // base
}
}
@main
enum InsertionSort {
/* Driver Code */
static func main() {
var nums = [4, 1, 3, 1, 5, 2]
insertionSort(nums: &nums)
print("挿入ソート完了後 nums = \(nums)")
}
}
@@ -0,0 +1,65 @@
/**
* File: merge_sort.swift
* Created Time: 2023-01-29
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func merge(nums: inout [Int], left: Int, mid: Int, right: Int) {
// [left, mid] [mid+1, right]
// tmp
var tmp = Array(repeating: 0, count: right - left + 1)
//
var i = left, j = mid + 1, k = 0
//
while i <= mid, j <= right {
if nums[i] <= nums[j] {
tmp[k] = nums[i]
i += 1
} else {
tmp[k] = nums[j]
j += 1
}
k += 1
}
//
while i <= mid {
tmp[k] = nums[i]
i += 1
k += 1
}
while j <= right {
tmp[k] = nums[j]
j += 1
k += 1
}
// tmp nums
for k in tmp.indices {
nums[left + k] = tmp[k]
}
}
/* */
func mergeSort(nums: inout [Int], left: Int, right: Int) {
//
if left >= right { // 1
return
}
//
let mid = left + (right - left) / 2 //
mergeSort(nums: &nums, left: left, right: mid) //
mergeSort(nums: &nums, left: mid + 1, right: right) //
//
merge(nums: &nums, left: left, mid: mid, right: right)
}
@main
enum MergeSort {
/* Driver Code */
static func main() {
/* */
var nums = [7, 3, 2, 6, 0, 1, 5, 4]
mergeSort(nums: &nums, left: nums.startIndex, right: nums.endIndex - 1)
print("マージソート完了後 nums = \(nums)")
}
}
@@ -0,0 +1,114 @@
/**
* File: quick_sort.swift
* Created Time: 2023-01-29
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
/* */
func partition(nums: inout [Int], left: Int, right: Int) -> Int {
// nums[left]
var i = left
var j = right
while i < j {
while i < j, nums[j] >= nums[left] {
j -= 1 //
}
while i < j, nums[i] <= nums[left] {
i += 1 //
}
nums.swapAt(i, j) // 2
}
nums.swapAt(i, left) // 2
return i //
}
/* */
func quickSort(nums: inout [Int], left: Int, right: Int) {
// 1
if left >= right {
return
}
//
let pivot = partition(nums: &nums, left: left, right: right)
//
quickSort(nums: &nums, left: left, right: pivot - 1)
quickSort(nums: &nums, left: pivot + 1, right: right)
}
/* */
/* 3 */
func medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {
let l = nums[left]
let m = nums[mid]
let r = nums[right]
if (l <= m && m <= r) || (r <= m && m <= l) {
return mid // m l r
}
if (m <= l && l <= r) || (r <= l && l <= m) {
return left // l m r
}
return right
}
/* 3 */
func partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {
// 3
let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)
//
nums.swapAt(left, med)
return partition(nums: &nums, left: left, right: right)
}
/* */
func quickSortMedian(nums: inout [Int], left: Int, right: Int) {
// 1
if left >= right {
return
}
//
let pivot = partitionMedian(nums: &nums, left: left, right: right)
//
quickSortMedian(nums: &nums, left: left, right: pivot - 1)
quickSortMedian(nums: &nums, left: pivot + 1, right: right)
}
/* */
func quickSortTailCall(nums: inout [Int], left: Int, right: Int) {
var left = left
var right = right
// 1
while left < right {
//
let pivot = partition(nums: &nums, left: left, right: right)
// 2
if (pivot - left) < (right - pivot) {
quickSortTailCall(nums: &nums, left: left, right: pivot - 1) //
left = pivot + 1 // [pivot + 1, right]
} else {
quickSortTailCall(nums: &nums, left: pivot + 1, right: right) //
right = pivot - 1 // [left, pivot - 1]
}
}
}
@main
enum QuickSort {
/* Driver Code */
static func main() {
/* */
var nums = [2, 4, 1, 0, 3, 5]
quickSort(nums: &nums, left: nums.startIndex, right: nums.endIndex - 1)
print("クイックソート完了後 nums = \(nums)")
/* */
var nums1 = [2, 4, 1, 0, 3, 5]
quickSortMedian(nums: &nums1, left: nums1.startIndex, right: nums1.endIndex - 1)
print("クイックソート(中央値ピボット最適化)完了後 nums1 = \(nums1)")
/* */
var nums2 = [2, 4, 1, 0, 3, 5]
quickSortTailCall(nums: &nums2, left: nums2.startIndex, right: nums2.endIndex - 1)
print("クイックソート(再帰深度最適化)完了後 nums2 = \(nums2)")
}
}
@@ -0,0 +1,79 @@
/**
* File: radix_sort.swift
* Created Time: 2023-01-29
* Author: nuomi1 (nuomi1@qq.com)
*/
/* num k exp = 10^(k-1) */
func digit(num: Int, exp: Int) -> Int {
// k exp
(num / exp) % 10
}
/* nums k */
func countingSortDigit(nums: inout [Int], exp: Int) {
// 10 0~9 10
var counter = Array(repeating: 0, count: 10)
// 0~9
for i in nums.indices {
let d = digit(num: nums[i], exp: exp) // nums[i] k d
counter[d] += 1 // d
}
//
for i in 1 ..< 10 {
counter[i] += counter[i - 1]
}
// res
var res = Array(repeating: 0, count: nums.count)
for i in nums.indices.reversed() {
let d = digit(num: nums[i], exp: exp)
let j = counter[d] - 1 // d j
res[j] = nums[i] // j
counter[d] -= 1 // d 1
}
// nums
for i in nums.indices {
nums[i] = res[i]
}
}
/* */
func radixSort(nums: inout [Int]) {
//
var m = Int.min
for num in nums {
if num > m {
m = num
}
}
//
for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {
// k
// k = 1 -> exp = 1
// k = 2 -> exp = 10
// exp = 10^(k-1)
countingSortDigit(nums: &nums, exp: exp)
}
}
@main
enum RadixSort {
/* Driver Code */
static func main() {
//
var nums = [
10_546_151,
35_663_510,
42_865_989,
34_862_445,
81_883_077,
88_906_420,
72_429_244,
30_524_779,
82_060_337,
63_832_996,
]
radixSort(nums: &nums)
print("基数ソート完了後 nums = \(nums)")
}
}
@@ -0,0 +1,31 @@
/**
* File: selection_sort.swift
* Created Time: 2023-05-28
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func selectionSort(nums: inout [Int]) {
// [i, n-1]
for i in nums.indices.dropLast() {
//
var k = i
for j in nums.indices.dropFirst(i + 1) {
if nums[j] < nums[k] {
k = j //
}
}
//
nums.swapAt(i, k)
}
}
@main
enum SelectionSort {
/* Driver Code */
static func main() {
var nums = [4, 1, 3, 1, 5, 2]
selectionSort(nums: &nums)
print("選択ソート完了後 nums = \(nums)")
}
}