1. 程式人生 > >冒泡排序的JavaScript實現

冒泡排序的JavaScript實現

代碼 最終 void 二次 c語言實現 最大值 整數 時間復雜度 fun

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");
}

冒泡排序的JavaScript實現