冒泡排序的JavaScript实现

1. 普通冒泡

思想

假设有n个数,按从小到大排序:

  • 进行n-1次外循环,每次外循环会排好当前处理的数中的最大数,即进行第一次外循环排好所有数中的最大数,进行第二次外循环排好所有数中的次大数....直到第n-1次外循环,排好第n-1大的数,也就是倒数第二小的数,那么剩下的那个就是最小的数
  • 在第i+1次外循环中,只需要处理前n-i-1个数,因为后面的i+1个数已经排好。即此时内循环需要比较前n-i-1个数。
  • 在内循环中,依次比较两个相邻项,如果前面一项比后面一项大,则交换他们。最终,内循环处理完这前n-i-1个数后,会把这n-i-1个数中最大的那个数排到第n-i-1的位置上。

代码

function bubbleSort(arr) {
  const length = arr.length;
  for (let i = 0; i < length - 1; i++) {
    let changeOccur = false; //用于标记某次外循环中,是否方式内循环交换事件
    for (let j = 0; j < length - i -1; j++) {
      if (arr[j] > arr[j+1]) {
        /*
        const temp = arr[j]; 
        arr[j] = arr[j+1];
        arr[j+1] = temp; 
        */
        //这三行的交换函数用ES6来写:
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
        changeOccur = true;
      }
    }

    if (!changeOccur) { //如果一次外循环中,没有发生一次内循环交换,那么可以直接结束排序比较
      break;
    }
  }
}

性能分析

  • 时间复杂度:最好O(n),平均、最坏O(n^2)
  • 空间复杂度: O(1), 稳定

2. 鸡尾酒排序

思想

双向的冒泡排序。

代码

function coaktailBubbleSort(arr) {
  const length = arr.length;
  let low = 0;
  let high = length - 1;
  
  while(low < high) {
    let changeOccur = false;
    for (let j = low; j < high; j++) {
      if(arr[j] > arr[j+1]) {
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
        changeOccur = true;
      }
    }
    if(!changeOccur) {
      break;//如果一次交换也没有发生,那直接就可以跳出,结束排序
    }
    high--;
    changeOccur = false;
    for (let j = high; j > low; j--) {
      if (arr[j] < arr[j-1]) {
        [arr[j-1], arr[j]] = [arr[j], arr[j-1]];
        changeOccur = true;
      }
    }
    if(!changeOccur) {
      break;
    }
    low++;
  }
}

延伸:对比冒泡排序的C语言实现:

1. 普通冒泡

# include<stdio.h>

void bubble(int *list,int len)
{
    int i,j,t,flag=0;
    for(i=0;i<len-1;i++)
    {
        flag=0;//设置标记,当某一轮交换没有交换任何数,那下一轮交换也不必进行了
        for(j=0;j<len-1-i;j++)
        {
            if(list[j]>list[j+1])
            {
                t=list[j];
                list[j]=list[j+1];
                list[j+1]=t;
                flag=1;
            }           
        }
        if(flag==0)
        {
          break;
        }
    }

}

void main()
{
    int n,list[10];
    printf("请输入10个整数:");
    for(n=0;n<10;n++)
    {
        scanf("%d",&list[n]);
    }
    printf("\n");
    bubble(list,10);
    for(n=0;n<10;n++)
    {
        printf("%d\t",list[n]);
    }
    printf("\n");

}

2. 鸡尾酒冒泡

#include<stdio.h>

void CocktailBubble(int *list,int n)
{
    int low=0,high=n-1,j,t,flag;
    while(low<high)
    {
        flag=0;//一次进行两趟for循环,第一个for循环排最大值(次大值),第二个for循环排最小值(次小值),只要其中一趟没有交换任何数字就可以结束排序
        for(j=low;j<high;j++)
        {
            if(list[j]>list[j+1])
            {
                t=list[j];
                list[j]=list[j+1];
                list[j+1]=t;
                flag=1;
            }
        }
        if(flag==0)
        {
            break;
        }
        high--;//上述for循环第一次结束,排完最大值;第二次,排完次大值
        flag = 0;
        for(j=high;j>low;j--)
        {
            if(list[j]<list[j-1])
            {
                t=list[j];
                list[j]=list[j-1];
                list[j-1]=t;
                flag = 1;
            }
        }
        if(flag==0)
        {
            break;
        }
        low++;//上述for循环第一次结束,排完最小值;第二次,排完次小值

    }
}

void main(){
    int i,list[10];
    printf("请输入10个整数:");
    for(i=0;i<10;i++){
        scanf("%d",&list[i]);
    }
    for(i=0;i<10;i++){
        printf("%d ",list[i]);
    }
    printf("\n");
    CocktailBubble(list,10);
    for(i=0;i<10;i++){
        printf("%d ",list[i]);
    }
    printf("\n");
}

转载于:https://www.cnblogs.com/Bonnie3449/p/9574421.html

### 回答1: JavaScript 实现冒泡排序的方法是:首先,比较相邻的元素。如果第一个比第二个大,就交换他们两个。然后,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。然后再下一轮,重复上述过程,直到排序完成。 ### 回答2: 冒泡排序是一种简单的排序算法,它通过比较相邻的元素并交换,使得较大(或较小)的元素逐渐移动到数组的一端。 以下是使用JavaScript实现冒泡排序的代码: ```javascript function bubbleSort(arr) { // 遍历数组的长度次数,每次排序将最大的元素移动到数组的末尾 for (let i = 0; i < arr.length; i++) { // 在每次遍历时,可以优化遍历的范围,因为每次遍历后,最大的元素会被移动到数组的末尾,所以下次遍历时可以减少遍历的次数 for (let j = 0; j < arr.length - 1 - i; j++) { // 比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置 if (arr[j] > arr[j + 1]) { let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } // 示例 let arr = [5, 3, 8, 4, 2]; let sortedArr = bubbleSort(arr); console.log(sortedArr); // 输出 [2, 3, 4, 5, 8] ``` 以上是使用JavaScript实现冒泡排序的简单示例。冒泡排序的时间复杂度为O(n^2),在实际应用中不适合用于大规模数据的排序,但可以用于小规模数据或已经基本有序的数据的排序。 ### 回答3: 冒泡排序是一种简单但效率较低的排序算法,可以使用JavaScript实现。下面是使用JavaScript实现冒泡排序的代码: ```javascript function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } var array = [5, 3, 8, 4, 2]; console.log(bubbleSort(array)); // 输出 [2, 3, 4, 5, 8] ``` 以上代码定义了一个`bubbleSort`函数,它接受一个数组作为参数,并使用冒泡排序算法数组进行排序。在内部的两个嵌套循环中,比较相邻元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。重复执行这个过程,直到整个数组排序完成。 在上述的例子中,数组`[5, 3, 8, 4, 2]`经过冒泡排序后会变成`[2, 3, 4, 5, 8]`,并通过`console.log()`函数输出到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值