1. 程式人生 > >常見的排序算法

常見的排序算法

子串 完成 但是 常見的排序算法 除了 quick sub 兩個 基準

冒泡排序Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

算法步驟

1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

3)針對所有的元素重復以上的步驟,除了最後一個。

4)持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

function bubbleSort(arr){

  var len = arr.length;

  for(var i=0; i<len; i++){ //總共需要比較的輪數

    for(var j=0; j<len-1-i; j++){ // 每一輪需要進行比較的數字

      if( arr[j]<arr[j+1]){ // 相鄰元素相比,小的移至到右邊

       var temp = arr[j+1];

       arr[j+1] = arr[j];

       arr[j] = temp;

      }

    }

  }

return arr;

}

選擇排序(Selection sort)也是一種簡單直觀的排序算法。

在時間復雜度上表現最穩定的排序算法之一,因為無論什麽數據進去都是O(n²)的時間復雜度。

算法步驟

1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2)再從剩余未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

3)重復第二步,直到所有元素均排序完畢。

function selectionSort(arr){

  var len = arr.length;

  var minIndex,temp;

  for(var i=0; i<len-1; i++){

    minIndex = i;

    for(var j=i+1;j<len;j++){

     if(arr[j] < arr[minIndex]){

      minIndex = j;

     } 

    }

    temp = arr[i];

    arr[i] = arr[minIndex];

     arr[minIndex] = temp;

  }

  return arr;

}

快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。

算法步驟:

1 從數列中挑出一個元素,稱為 “基準”(pivot),

2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。

3 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的叠代(iteration)中,它至少會把一個元素擺到它最後的位置去。

function quickSort(arr, left, right) {

  var len = arr.length,

    partitionIndex,

left = typeof left != ‘number‘ ? 0 : left,

    right = typeof right != ‘number‘ ? len - 1 : right;

   if (left < right) {

     partitionIndex = partition(arr, left, right);

     quickSort(arr, left, partitionIndex-1);

     quickSort(arr, partitionIndex+1, right);

    }

   return arr;

}

function partition(arr, left ,right) { //分區操作

   var pivot = left,//設定基準值(pivot)

   index = pivot + 1;

   for (var i = index; i <= right; i++) {

     if (arr[i] < arr[pivot]) {

      swap(arr, i, index); index++;

    }

  }

  swap(arr, pivot, index - 1);

  return index-1;

}

function swap(arr, i, j) {

   var temp = arr[i];  

  arr[i] = arr[j];

  arr[j] = temp;

}

常見的排序算法