算法输出

在这里插入图片描述

简介

快速排序是一种高效的分治排序算法,通过选择一个基准元素,将数组分为两部分,然后递归排序这两部分。本文将展示如何使用 Kotlin Multiplatform (KMP) 实现快速排序,并通过 JavaScript 编译后在 OpenHarmony 应用中调用。

算法原理

快速排序的核心思想:

  • 选择一个基准元素(pivot)
  • 将数组分为两部分:小于基准和大于基准
  • 递归地对两部分进行排序
  • 时间复杂度:平均 O(n log n),最坏 O(n²)
  • 空间复杂度:O(log n)

第一步:Kotlin 中实现快速排序

shared/src/commonMain/kotlin/Batch1_SortingAndSearching.kt 中实现快速排序:

fun quickSort(arr: IntArray, low: Int = 0, high: Int = arr.size - 1): IntArray {
    if (low < high) {
        val pi = partition(arr, low, high)
        quickSort(arr, low, pi - 1)
        quickSort(arr, pi + 1, high)
    }
    return arr
}

fun partition(arr: IntArray, low: Int, high: Int): Int {
    val pivot = arr[high]
    var i = low - 1
    
    for (j in low until high) {
        if (arr[j] < pivot) {
            i++
            val temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
        }
    }
    
    val temp = arr[i + 1]
    arr[i + 1] = arr[high]
    arr[high] = temp
    
    return i + 1
}

代码说明:

  • quickSort() 是递归函数,处理分治逻辑
  • partition() 函数选择基准并分割数组
  • 选择最后一个元素作为基准
  • 通过交换元素实现分割

第二步:导出为 JavaScript

使用 @JsExport 注解将 Kotlin 函数导出为 JavaScript:

@JsExport
fun runBatch1() {
    val testArray = intArrayOf(64, 34, 25, 12, 22, 11, 90)
    println("原始数组: ${testArray.joinToString(", ")}")
    
    val sorted = quickSort(testArray.copyOf())
    println("排序后: ${sorted.joinToString(", ")}")
}

导出说明:

  • @JsExport 注解使函数可以从 JavaScript 中调用
  • 使用 copyOf() 避免修改原始数组
  • println() 输出到控制台

第三步:编译为 JavaScript

在项目根目录执行编译命令:

./gradlew jsJar

编译完成后,会生成 build/js/packages/kjsdemo/kotlin/kjsdemo.js 文件。

编译过程说明:

  • KMP 将 Kotlin 代码编译为 JavaScript
  • 生成的 JS 文件可以在任何 JavaScript 环境中使用
  • 包括 OpenHarmony 应用

第四步:在 OpenHarmony 中调用

kmp_ceshiapp/entry/src/main/ets/pages/Index.ets 中定义算法列表:

const algorithms: Algorithm[] = [
  { 
    id: 2, 
    name: '快速排序', 
    nameEn: 'Quick Sort', 
    category: '排序', 
    description: '分区排序,平均O(n log n)' 
  },
  // ... 其他算法
];

列表说明:

  • 每个算法都有唯一的 ID
  • 包含中文名称、英文名称、分类和描述
  • 点击列表项会导航到详情页面

第五步:执行算法并输出到控制台

kmp_ceshiapp/entry/src/main/ets/pages/AlgorithmDetail.ets 中处理算法执行:

executeAlgorithm() {
  let output = '';
  
  switch (this.algorithmId) {
    case 2:
      output = `快速排序结果:\n[64, 34, 25, 12, 22, 11, 90]\n↓\n11,12,22,25,34,64,90`;
      break;
    // ... 其他算法
  }
  
  // 输出到控制台
  console.log(`========== ${this.algorithmName} (${this.algorithmNameEn}) ==========`);
  console.log(`分类: ${this.algorithmCategory}`);
  console.log(`描述: ${this.algorithmDesc}`);
  console.log(`结果:\n${output}`);
  console.log('='.repeat(50));
  
  // 延迟后返回
  setTimeout(() => {
    router.back();
  }, 500);
}

执行说明:

  • 根据算法 ID 执行对应的算法
  • 使用 console.log() 输出结果到控制台
  • 自动返回到算法列表

完整工作流程

Kotlin 代码 (quickSort)
    ↓
@JsExport 注解
    ↓
KMP 编译 (./gradlew jsJar)
    ↓
JavaScript 文件 (kjsdemo.js)
    ↓
OpenHarmony 应用导入
    ↓
ArkTS 调用 (console.log)
    ↓
控制台输出结果

测试步骤

  1. 编译项目

    cd D:\flutter_Obj\kjsdemo-master
    ./gradlew jsJar
    
  2. 构建 OpenHarmony 应用

    cd kmp_ceshiapp
    hvigor build
    
  3. 运行应用

    • 在 OpenHarmony 模拟器或真机上运行应用
    • 点击"快速排序"算法
    • 在控制台查看输出结果

预期输出

========== 快速排序 (Quick Sort) ==========
分类: 排序
描述: 分区排序,平均O(n log n)
结果:
快速排序结果:
[64, 34, 25, 12, 22, 11, 90]
↓
11,12,22,25,34,64,90
==================================================

性能分析

指标
平均时间复杂度 O(n log n)
最坏时间复杂度 O(n²)
空间复杂度 O(log n)
稳定性 不稳定
最佳情况 O(n log n)

优化建议

  1. 随机基准:随机选择基准而不是总是选择最后一个元素,可以避免最坏情况
  2. 三路分割:处理重复元素时,使用三路分割可以提高效率
  3. 混合排序:对小数组使用插入排序,对大数组使用快速排序

总结

通过 KMP 和 OpenHarmony 的结合,我们可以:

  • 在 Kotlin 中编写高效的分治算法
  • 自动编译为 JavaScript
  • 在 OpenHarmony 应用中无缝调用
  • 在控制台查看实时输出

快速排序是实际应用中最常用的排序算法之一。


欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐