使用【python语言】和【typescript】进行冒泡排序

冒泡排序是一种简单的排序算法,通过不断交换相邻错误顺序的元素使其逐渐‘浮’到正确位置。本文展示了使用Python和TypeScript两种语言实现冒泡排序的代码示例,包括具体的输入列表和排序后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

它重复的访问需要排序的元素列,并依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。以下是图片详解:
冒泡排序
冒泡排序2

Python代码

存在列表:[5, 0, 1, 6, 3, 2, 9, 8, 7, 10, 4, 11]

# 冒泡排序
list1 = [5, 0, 1, 6, 3, 2, 9, 8, 7, 10, 4, 11]


def bubble_sort(sort):
    # 遍历列表
    for l in range(length := len(sort)):
        # 遍历比较前后两个元素
        for s in range(length):
        	# 若排序错误,则进行交换
            if s + 1 < length and sort[s] > sort[s + 1]:
                sort[s], sort[s + 1] = sort[s + 1], sort[s]
    return sort


print(bubble_sort(list1))

返回结果:
py--结果

TypeScript代码

存在列表:[5, 0, 1, 6, 3, 2, 9, 8, 7, 10, 4, 11]

// 冒泡排序
let list1 = [5, 0, 1, 6, 3, 2, 9, 8, 7, 10, 4, 11]

function bubbleSort(sort: number[]) {
    let length = sort.length
    // 遍历列表
    for (let num: number = 0; num < length; num++) {
        // 遍历比较前后两个元素
        for (let value: number = 0; value < length; value++) {
            // 若排序错误,则进行交换
            if (value + 1 < length && sort[value] > sort[value + 1]) {
                let val = sort[value]
                sort[value] = sort[value + 1]
                sort[value + 1] = val
            }
        }
    }
    return sort
}

console.log(bubbleSort(list1))

返回结果:
ts--结果

参考:冒泡排序图片参考

<think>嗯,用户让我用TypeScript写一个冒泡排序。首先,我需要确认自己对冒泡排序的理解是否正确。冒泡排序的基本思想是通过相邻元素的比较交换,将较大的元素逐渐“浮”到数组的末尾。每一轮遍历都会确定一个最大的元素的位置,这样经过n-1轮后,整个数组就排好序了。 接下来,我应该考虑如何在TypeScript中实现这个算法TypeScript是JavaScript的超集,所以语法上应该JavaScript类似,但需要加上类型声明。首先,函数应该接收一个数字数组作为参数,并返回排序后的数组。参数的类型应该是number[],返回值也是number[]。 然后,我需要考虑冒泡排序的具体步骤。外层循环控制遍历的次数,内层循环负责比较相邻元素并进行交换。因为每一轮遍历后,最大的元素已经到位,所以内层循环的次数可以减少已经排序的元素数量。比如,第一轮需要比较n-1次,第二轮n-2次,以此类推。 这里需要注意,TypeScript中的变量声明可能需要明确类型,比如循环变量ij应该是number类型。还有,交换元素的时候,可以使用解构赋值或者临时变量。解构赋值可能更简洁,比如[a[j], a[j+1]] = [a[j+1], a[j]]。 另外,用户可能希望函数不改变原数组,所以在函数内部应该先复制原数组,然后对副本进行操作。可以使用slice()方法进行浅拷贝,这样原数组不会被修改。 测试用例也很重要,需要写几个例子来验证排序是否正确。比如,测试一个无序数组、一个逆序数组、一个已经排序的数组以及有空数组的情况。这样可以覆盖不同的边界条件。 在优化方面,可以加入一个标志位来判断某一轮是否有交换发生。如果没有交换,说明数组已经有序,可以提前结束循环,减少不必要的比较次数。这个优化对部分已排序的数组效率提升明显。 最后,要确保代码符合TypeScript的类型检查,比如参数返回值的类型是否正确,变量是否有正确的类型注解。可能还需要考虑导出函数,以便其他模块使用。 总结步骤应该是:定义函数,复制数组,外层循环,内层循环,比较交换,优化提前终止,返回结果。同时,提供示例用法测试结果,帮助用户理解代码的运行过程。</think>我们将分步骤使用TypeScript实现冒泡排序,并提供详细解释: --- ### 一、算法原理 冒泡排序通过重复遍历数组,依次比较相邻元素。若顺序错误则交换它们,直到整个数组有序。时间复杂度为O(n²) --- ### 二、基础实现代码 ```typescript function bubbleSort(arr: number[]): number[] { const n = arr.length; // 创建副本避免修改原数组 const array = arr.slice(); // 外层循环控制遍历次数 for (let i = 0; i < n - 1; i++) { // 内层循环进行元素比较 for (let j = 0; j < n - i - 1; j++) { // 相邻元素比较 if (array[j] > array[j + 1]) { // 使用解构赋值交换元素 [array[j], array[j + 1]] = [array[j + 1], array[j]]; } } } return array; } ``` --- ### 三、关键优化点 #### 优化1:提前终止 增加交换标志位,若某轮未发生交换则提前结束排序: ```typescript function optimizedBubbleSort(arr: number[]): number[] { const array = arr.slice(); let swapped: boolean; for (let i = 0; i < array.length - 1; i++) { swapped = false; for (let j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { [array[j], array[j + 1]] = [array[j + 1], array[j]]; swapped = true; } } // 无交换时提前终止 if (!swapped) break; } return array; } ``` --- ### 四、使用示例 ```typescript // 测试用例 const testCases = [ [64, 34, 25, 12, 22, 11, 90], [5, 4, 3, 2, 1], [1, 2, 3, 4, 5], [] ]; testCases.forEach(arr => { console.log(`Original: ${arr}`); console.log(`Sorted: ${bubbleSort(arr)}`); console.log(`Optimized: ${optimizedBubbleSort(arr)}\n`); }); ``` --- ### 五、执行结果示例 ``` Original: 64,34,25,12,22,11,90 Sorted: 11,12,22,25,34,64,90 Optimized: 11,12,22,25,34,64,90 Original: 5,4,3,2,1 Sorted: 1,2,3,4,5 Optimized: 1,2,3,4,5 Original: 1,2,3,4,5 Sorted: 1,2,3,4,5 Optimized: 1,2,3,4,5 // 优化版本提前终止 Original: Sorted: Optimized: ``` --- ### 六、算法特点 1. **稳定排序**:相等元素不会改变相对顺序 2. **原地排序**:空间复杂度O(1) 3. **适应性**:优化版本对部分有序数组效率更高 需要处理大规模数据时建议使用更高效的排序算法(如快速排序、归并排序),但冒泡排序在小规模数据或教学场景中仍有其价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warolitbos

如果有帮助,请我喝咖啡!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值