javascript實現數據結構中的基本排序方法

簡要介紹:基本排序方法,不外乎爲冒泡法排序法,插入排序法,選擇排序法,歸併排序法和快速排序法。

1.冒泡排序法
原理:比較任何相鄰的項,如果第一個比第二個大,則交換它們,元素相步步上移,最大的元素依次沉底。

//來一個冒泡排序
function bobbleSort(myArr){
    var length=myArr.length;
    for(var i=0;i<length;i++){
        for(var j=0;j<length-1;j++){
            if(myArr[j]>myArr[j+1]){
                var temple=myArr[j];
                temple=myArr[j+1];
                myArr[j+1]=myArr[j];
                myArr[j]=temple;                
            }
        }

    }
    return myArr;
}

改進後的冒泡:內循環減去外循環中已經跑過的輪次,就可以閉環內循環中不必要的比較

//改進後的冒泡排序,可以少比較幾次,修改length-1-i可以減少比較次數
function upBobbleSort(myArr){
    var length=myArr.length;
    for(var i=0;i<length;i++){
        for(var j=0;j<length-1-i;j++){
            if(myArr[j]>myArr[j+1]){
                var temple=myArr[j+1];
                    myArr[j+1]=myArr[j];
                    myArr[j]=temple;
            }
        }
    }
    return myArr;   
}

2.選擇排序法
原理是原址比較的排序,每次循環取到本次的最小值,依次放在首位等

//選擇排序法,原理:每次先選擇最小的那個放在首部,依次迭代
function selectSort(myArr){
    var length=myArr.length||0;
    for(var i=0;i<length;i++){
        var minIndex=i;
        for(var j=i;j<length;j++){
            if(myArr[j]<myArr[minIndex]){
                var temple=myArr[j];
                myArr[j]=myArr[minIndex];
                myArr[minIndex]=temple;
            }
        }

    }
    return myArr;
}

3.插入排序法
原理:每次排一個數組項,並且依次比較前面已經排好的數組,決定新的數組應該插入的位置

//插入排序法,第一項已經排好序或者前n項已經排好序,新到一項插入即可
function insertionSort(myArr){
    var length=myArr.length||0;
    for(var i=1;i<length;i++){
        var temple=myArr[i],
            j=i;
            while(myArr[j-1]>temple&&j>0){
              myArr[j]=myArr[j-1];
              j--;
            }
            myArr[j]=temple;        
    }
    return myArr;
}

4.歸併排序
原理:是一種分治算法,將原始數組分成較小的,接着將小的數組合併成較大的

//分組排序法,歸併排序法
function mergeSortRec(myArr){
    var mid=Math.floor(myArr.length/2);
    if(myArr.length==1){
       return myArr;
    }
    var left=myArr.slice(0,mid);
    var right=myArr.slice(mid);
    return merge(mergeSortRec(left),mergeSortRec(right));
}
function merge(left,right){
    var result=[],
        il=0,
        ir=0;
    while(il<left.length&&ir<right.length){
        if(left[il]>right[ir]){
            result.push(right[ir]);
            ir++
        }else{
            result.push(left[il]);
            il++
        }
    }
    while(il<left.length){
        //有一些超過倆倆比較的需要額外的手動添加
        result.push(left[il++]);
    }
    while(ir<right.length){
        result.push(right[ir++]);
    }
    return result;
}

5.快速排序法
(1)選擇主元
(2)劃分數組,進行左右指針比較
(3)依次循環

//快速排序法
function  quickSort(myArr,left,right){
    //left表示起始的節點,right表示結束的節點~
    var index,
        array=myArr;
    if(array.length>1){
        index=partion(array,left,right);
        if(left<index-1){
            quickSort(array,left,index-1);
        }
        if(index<right){
            quickSort(array,index,right);
        }
        return array;
    }
}
function partion(array,left,right){
    var mid=Math.floor((left+right)/2),
        il=left,
        ir=right;
    while(il<=ir){
         while(array[il]<array[mid]){
             il++
         }
         while(array[ir]>array[mid]){
             ir--;
         }
         //交換
         if(il<=ir){
             var temple;
             temple=array[il];
             array[il]=array[ir];
             array[ir]=temple;
             il++;
             ir--;

         }

     }
     return il;
}

6.補充
排好序的數組,可以通過二分法實現快速的查找(這裏我們假定數組已經從小到大的排好序了)
(1)選擇數組的中間值
(2)如果中間值是待搜索值,那麼結束
(3)如果比待搜索值小,則返回(1)選擇左邊數組進行搜索
(4)如果比待搜索值大,則返回(1)選擇右邊數組進行搜索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章