關於排序算法

看到排序,不少人會一會兒就想到冒泡算法,由於它在全部排序算法中最簡單。然而,從運行時間的角度來看,冒泡排序是最差的一個 。算法


 首先這裏定義一下全局:
數組

function ArrayList(){
  var array = [];
  this.insert = function(item){
    array.push(item);
  };
  this.toString= function(){
    return array.join();
  };
}
var swap = function(index1, index2){
   var aux = array[index1];
  array[index1] = array[index2];
  array[index2] = aux;
};

 

1.冒泡排序數據結構

冒牌排序的原理很簡單:比較任何兩個相鄰的項,若是第一個比第二個大,則交換它們。 
this

代碼實現即爲:spa

this.bubbleSort = function(){
  var length = array.length; 
  for (var i=0; i<length; i++){ 
    for (var j=0; j<length-1; j++ ){ 
      if (array[j] > array[j+1]){ 
        swap(j, j+1); 
      }
    }
  }
};

 注意當算法執行外循環的第二輪的時候,數字45已是正確排序的了。儘管如此,在後續比較中,它們還一直在進行着比較,即便這是沒必要要的。所以,咱們能夠稍稍改進一下冒泡排序算法。
指針

this.modifiedBubbleSort = function(){
  var length = array.length;
  for (var i=0; i<length; i++){
    for (var j=0; j<length-1-i; j++ ){
      if (array[j] > array[j+1]){
        swap(j, j+1);
      }
    }
  }
};

 

2.選擇排序code

 選擇排序算法是一種原址比較排序算法。選擇排序大體的思路是找到數據結構中的最小值並將其放置在第一位,接着找到第二小的值並將其放在第二位,以此類推。blog

this.selectionSort = function(){
  var length = array.length, 
     indexMin;
  for (var i=0; i<length-1; i++){ 
    indexMin = i; 
    for (var j=i; j<length; j++){ 
      if(array[indexMin]>array[j]){ 
        indexMin = j; 
      }
    }
    if (i !== indexMin){ 
      swap(i, indexMin);
    }
  }
};

 3.插入排序排序

插入排序每次排一個數組項,以此方式構建最後的排序數組。假定第一項已經排序了,接着,它和第二項進行比較,第二項是應該待在原位仍是插到第一項以前呢?這樣,頭兩項就已正確排序,接着和第三項比較(它是該插入到第1、第二仍是第三的位置呢?),以此類推。 
it

this.insertionSort = function(){
  var length = array.length, 
     j, temp;
  for (var i=1; i<length; i++){ 
    j = i; 
    temp = array[i]; 
    while (j>0 && array[j-1] > temp){ 
      array[j] = array[j-1]; 
      j--;
    }
    array[j] = temp; 
  }
};

 

 4.歸併排序

其思想是將原始數組切分紅較小的數組,直到每一個小數組只有一個位置,接着將小數組歸併成較大的數組,直到最後只有一個排序完畢的大數組。 

 

 5.快速排序 

(1) 首先,從數組中選擇中間一項做爲主元。

(2) 建立兩個指針,左邊一個指向數組第一個項,右邊一個指向數組最後一個項。移動左指針直到咱們找到一個比主元大的元素,接着,移動右指針直到找到一個比主元小的元素,而後交換它們,重複這個過程,直到左指針超過了右指針。這個過程將使得比主元小的值都排在主元以前,而比主元大的值都排在主元以後。這一步叫做劃分操做。

(3) 接着,算法對劃分後的小數組(較主元小的值組成的子數組,以及較主元大的值組成的子數組)重複以前的兩個步驟,直至數組已徹底排序。 

相關文章
相關標籤/搜索