經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)

Jc Bound發表於2019-03-01

前言

一般來說,前端在演算法方面接觸的不多,除非是一些大公司,可能對此有要求,但是對於一個前端來說,瞭解一些基本的演算法也是必需的,在遇到這方面的需求時,也不至於捉襟見肘,手足無措,今天來說說經常提及的幾個演算法,後續如有必要在補充。

氣泡排序

氣泡排序是最基本的排序,也是演算法入門的第一個排序方法,比較簡單,兩兩比較,值大的與值小的交換位置,經過一定迴圈次數後就能完成排序,相比其他排序方法,在面對較多資料時耗時最多。

平均時間複雜度:O(n^2)
最好情況:O(n)
最壞情況:O(n^2)
穩定性:穩定

虛擬碼:

“<-”表示賦值符號,
a<-{
    "0":7
    "1":5
    "2":4
    "3":3
    "4":2
    "length":5
}
//迴圈次數
n<-1
while(n<length)
    while(i<-0;i<length-n)
    if(a[i]>a[i+1])
        t<-a[i]
        a[i]<-a[i+1]
        a[i+1]<-t
        i<-i+1
        end
        n<-n+1
    end
    print a
    end
     
複製程式碼

js程式碼

function arr(a) {
            var j=a.length;
            n=1;
            for(n=1;n<j;n++){
            for(i=0;i<j-n;i++){
                if (a[i]>a[i+1]){
                    t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                }
                
            }
           
        } console.log(a); 
        }
        arr([4,2,7,5,3,10,8,1,0,16])
複製程式碼

流程圖

經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)

選擇排序

選擇排序首先從原始陣列中找到最小的元素,並把該元素放在陣列的最前面,然後再從剩下的元素中尋找最小的元素,放在之前最小元素的後面,直到排序完畢。

平均時間複雜度:O(n^2)
最好情況:O(n^2)
最壞情況:O(n^2)
穩定性:不穩定

虛擬碼

a<-{
    "0":7
    "1":5
    "2":4
    "3":3
    "4":2
    "length":5
}
n<-1//迴圈次數
while(n<length)
    minindex<-n-1
    index<-minindex+1
    while(index<length)
        if(a[minindex]>a[index])
        minindex<-index
        index<-index+1
    end
    n<-n+1
    end
    print a
    end
複製程式碼

js程式碼

function iarr(a){    
            for(var n=1;n<a.length;n++){
                var minindex=n-1;
                for(var index=minindex+1;index<a.length;index++){
                    if(a[minindex]>a[index]){
                        minindex=index;
                    }
                     
                }
                var t=a[n-1];
                    a[n-1]=a[minindex];
                    a[minindex]=t;
                     
            }
            console.log(a) 
        }
        iarr([4,2,7,5,3,10,8,1,0,16])
複製程式碼

經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)

計數排序

計數排序是用於確定範圍的整數的線性時間排序演算法,這一句話我們就可以知道計數排序該如何用了(注意:它只能使用在整數範圍)

平均時間複雜度:O(n+k)
最好情況:O(n+k)
最壞情況:O(n+k)
穩定性:穩定

虛擬碼

a<-{
    "0":7
    "1":5
    "2":4
    "3":3
    "4":2
    "length":5
}
n<-1//迴圈次數
max<-n-1
index<-max+1
while(index<length)
  if(a[max]<a[index])//迴圈找出最大值max
    max<-index
    index<-index+1
    end
    t<-a[n-1]
    a[n-1]<-a[max]
    a[max]<-t
end
b<-{}//建立新陣列,填充0
max<-a[0]
while(index2<max+1)
    b[index2]<-0
    index2<-index2+1
end
while(index2<length)//將a陣列值依照出現次數放在對應的b陣列中,
    b[a[index]]<-b[a[index]]+1
index2<-index2+1
end
b<-{
    "0":0
    "1":0
    "2":1
    "3":1
    "4":1
    "5":1
    "6":0
    "7":1
}
arr<-{}
index3<-0
while(index3<max+1)
    if(b[index3]>0)
    arr.push(index3)//將符合要求的值推入新陣列arr
    b[index3]<-b[index3]-1
    index3<-index3+1
end
    print a
end

複製程式碼

js程式碼

function maths(arr){
        var j=arr.length;
        var orr=[];
        n=1;
        max=n-1;
        for(n=1;index<j;index++){
            if(arr[max]<arr[index]){
                max=index;

            }   
            var t=arr[n-1];
            arr[n-1]=arr[max]
            arr[max]=t;
        }
        max=arr[0];
            var B=[];
            for(var index2=0;index2<max+1;index2++){
                B[index2]=0;
            }
        for(index2=0;index2<j;index2++){
            B[arr[index2]]++

        }
        for(index3=0;index3<max+1;index3++){
            while (B[index3]>0) {
                orr.push(index3);
                B[index3]--;
            }
            
        }
        console.log(orr);  
}
maths([7,5,4,3,2])
複製程式碼

流程圖

經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)

未完待續……

相關文章