面試必問:排序算法,廢話很少說,直接上代碼[node.js]

百度渣渣搜出來的都是c,c++,java版本,不多見簡單js版本,我正好本身搞了一版,分享給大家java

//1.冒泡排序
var exchange = function (a, i, j)        // 交換A[i]和A[j]
{
  var temp = a[i];
  a[i] = a[j];
  a[j] = temp;
}

var sort = function (a) {
  var n = a.length;
  for (var j = 0; j < n - 1; j++)            // 每次最大元素就像氣泡同樣"浮"到數組的最後
  {
    for (var i = 0; i < n - 1 - j; i++)    // 依次比較相鄰的兩個元素,使較大的那個向後移
    {
      if (a[i] > a[i + 1])            // 若是條件改爲A[i] >= A[i + 1],則變爲不穩定的排序算法
      {
        exchange(a, i, i + 1);
      }
    }
  }

  return a;
}
var a = [6, 5, 3, 1, 8, 7, 2, 4];    // 從小到大排序
// console.log(sort(a))


//------------2.選擇排序------------
var exchange = function (a, i, j)        // 交換A[i]和A[j]
{
  var temp = a[i];
  a[i] = a[j];
  a[j] = temp;
}

var selectSort = function (a) {
  var n = a.length;
  var i, j, min;
  for (i = 0; i <= n - 2; i++)                // 已排序序列的末尾
  {
    min = i;
    for (j = i + 1; j <= n - 1; j++) {  // 未排序序列
      if (a[j] < a[min])// 依次找出未排序序列中的最小值,存放到已排序序列的末尾
      {
        min = j;
      }
    }
    if (min != i) {
      exchange(a, min, i);    // 該操做頗有可能把穩定性打亂,因此選擇排序是不穩定的排序算法
    }
  }
  return a;
}
var a = [6, 5, 3, 1, 8, 7, 2, 4];    // 從小到大排序
console.log(selectSort(a))


//-----------3.插入排序------------

var insertSort = function (a) {
  var n = a.length;
  var i, j, get;
  for (i = 1; i < n; i++)             // 相似抓撲克牌排序
  {
    get = a[i];                     // 右手抓到一張撲克牌
    j = i - 1;                      // 拿在左手上的牌老是排序好的
    while (j >= 0 && a[j] > get)    // 將抓到的牌與手牌從右向左進行比較
    {
      a[j + 1] = a[j];            // 若是該手牌比抓到的牌大,就將其右移
      j--;
    }
    a[j + 1] = get;// 直到該手牌比抓到的牌小(或兩者相等),將抓到的牌插入到該手牌右邊(相等元素的相對次序未變,因此插入排序是穩定的)
  }
  return a;
}
var a = [6, 5, 3, 1, 8, 7, 2, 4];    // 從小到大排序
console.log(insertSort(a))


//-----------4.shell排序------------

var shellSort = function (a) {
  var n = a.length;
  var i, j, get;
  var h = 0;
  while (h <= n)                          // 生成初始增量
  {
    h = 3 * h + 1;
  }
  while (h >= 1) {
    for (i = h; i < n; i++) {
      j = i - h;
      get = a[i];
      while ((j >= 0) && (a[j] > get)) {
        a[j + h] = a[j];
        j = j - h;
      }
      a[j + h] = get;
    }
    h = (h - 1) / 3;                    // 遞減增量
  }
  return a;
}
var a = [6, 5, 3, 1, 8, 7, 2, 4];    // 從小到大排序
console.log(shellSort(a))


//-----------5.快速排序----------------
var exchange = function (a, i, j)        // 交換A[i]和A[j]
{
  var temp = a[i];
  a[i] = a[j];
  a[j] = temp;
}

var partition = function (a, left, right)  // 劃分函數
{
  var pivot = a[right];                    // 選擇最後一個元素做爲基準
  var tail = left - 1;                     // tail爲小於基準的子數組最後一個元素的索引
  for (var i = left; i < right; i++)       // 遍歷基準之外的其餘元素
  {
    if (a[i] <= pivot)                   // 把小於等於基準的元素放到前一個子數組中
    {
      tail++;
      exchange(a, tail, i);
    }
  }
  exchange(a, tail + 1, right);            // 最後把基準放到前一個子數組的後邊,剩下的子數組既是大於基準的子數組
  // 該操做頗有可能把後面元素的穩定性打亂,因此快速排序是不穩定的排序算法
  return tail + 1;                         // 返回基準的索引
}

var quicksort = function (a, left, right) {
  var pivot_index;                        // 基準的索引
  if (left < right) {
    pivot_index = partition(a, left, right);
    quicksort(a, left, pivot_index - 1);
    quicksort(a, pivot_index + 1, right);
  }
  return a;
}
var a = [6, 5, 3, 1, 8, 7, 2, 4];    // 從小到大排序
console.log(quicksort(a, 0, a.length - 1))
相關文章
相關標籤/搜索