1. 程式人生 > >排序算法的JS實現

排序算法的JS實現

pan 掃描 left .com length 中間 tail 而不是 最小

排序算法是基礎算法,雖然關鍵在於算法的思想而不是語言,但還是決定借助算法可視化工具結合自己常用的語言實現一下

1.冒泡排序

基本思路:依次比較兩兩相鄰的兩個數,前面數比後面數小,不變。前面數比後面數大,交換順序。一輪下來,最後的一個數是最大的數。

外循環每增加一次,內循環減少一次。

圖形展示:

技術分享

function bubbleSort(arr){
  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j< arr.length-i-1; j++) {
      if(arr[j]>arr[j+1]){
        
var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; }

2.選擇排序

基本思路:循環數組,找出最小的值,和第一個交換位置;然後在剩下的數中,找出第二小的數,放在第二個;依次類推。

圖形展示:

技術分享

function selectSort(arr){
  for( var i=0;i<arr.length-1;i++){
    var min=i;
    for(var j=i+1;j<arr.length;j++){
      if
(arr[j]<arr[min]){ min=j; } if(i!=min){ var temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; } } } return arr; }

3.插入排序

基本思路:把數組分為[已排序]和[未排序]兩部分,第一個數為[已排序],其余為[未排序];

從[未排序]中抽出一個數,和[已排序]部分比較,插入到合適位置。

圖形展示:

技術分享

function insert(arr){
  
for(var i=0;i<arr.length;i++){ var value=arr[i]; //i表示未排序部分的當前位置,value表示當前比較的元素 for(var j=i-1;j>=0&&value<arr[j];j--){ //j表示已排序部分的當前位置 arr[j+1]=arr[j]; } arr[j+1]=value; } return arr; }

4、合並排序

基本思路:不斷的將數組對半分,只到每個數組只有一個元素;

將分出來的部分重新合並,合並的時候按順序排列。

圖形展示:

技術分享

方法一

function mergeSort(arr){
  if(arr.length<2){
    return arr;
  }
  var middle=Math.floor(arr.length/2),
  left=arr.slice(0,middle),
  right=arr.slice(middle);
  return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right){
  var result=[];
  while(left.length>0 && right.length>0){
    if(left[0]<=right[0]){
      result.push(left.shift());
    }else{
      result.push(right.shift());
    }
  }
  // while(left.length){
  //   result.push(left.shift());
  // }
  // while(right.length){
  //   result.push(right.shift());
  // }
  if(left.length){
    result=result.concat(left);
  }
  if(right.length){
    result=result.concat(right)
  }
  return result;
}

方法二

function mergeSort(arr){
    //只有一個數的時候退出遞歸
    if(arr.length<2){
        return arr;
    }
    //遞歸
    var middle=Math.floor(arr.length/2),
        left=arr.slice(0,middle),
        right=arr.slice(middle);
    
    return merge(mergeSort(left),mergeSort(right))    
}

//將兩個數組合並;合並的時候按從小到大的順序 
function merge(left,right){
    var left_index=0,
    right_index=0,
    result=[];
    while(left_index<left.length&&right_index<right.length){
        if(left[left_index]<right[right_index]){
            result.push(left[left_index++]);
        }else{
            result.push(right[right_index++]);
        }
    }
    return result.concat(left.slice(left_index),right.slice(right_index));

5.快速排序

基本思路:以一個數為基準,比基準小的數放到左邊,比基準大的值放右邊;遞歸進行,不能再分後退出遞歸

圖形展示:

技術分享

方法一:以中間值為基準,這種方法創建了兩個新數組,暫用空間

function quickSort(arr){
    if(arr.length<2){
        return arr;
    }
    var base=Math.floor(arr.length/2);
    var pirot=arr.splice(base,1)[0];    //基準值
    var left=[],
    right=[];
    
    for(var i=0;i<arr.length;i++){
        if(arr[i]<pirot){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    // 遞歸,把數組合並在一起把數組合並在一起
    return quickSort(left).concat([pirot],quickSort(right));
}

方法二,以第一個值為基準,先向從右往左,找比它小的值;再從左向右找比它大的值

var quickSort = function(arr, head, tail) {
  if (head > tail) {
      return;
    }
    var i=head;
    var j=tail;
    var Pivot=arr[i]; /**< 選取基準值 */
    while (i<j) {
        //使用j,從序列最右端開始掃描,直到遇到比基準值小的數
        while ((i<j) && (Pivot <= arr[j])) {
          j--;
        }
        //交換位置
        if (i<j) {
          arr[i++]=arr[j];
        }

        //使用i,從序列最左端開始掃描,直到遇到比基準值大的數
        while ( (i<j) && (Pivot >=arr[i]) ) {
          i++;
        }
        //交換位置
        if (i<j) {
          arr[j--]=arr[i];
        }
    }
  
    //最後填入基準值放入合適的位置
    arr[j]=Pivot;
    //對基準值兩邊序列進行排序的遞歸調用
    quickSort(arr, head, i-1);
    quickSort(arr, i+1, tail);
    return arr;
}

排序算法的JS實現