ソートアルゴリズム

バブルソート

function bubbleSort(data) {
  var l = 0, r = data.length - 1, i, temp, last;
  while(l < r) {
    i = r;
    last = l;
    while(i > l) {
      if(data[i-1] > data[i]) {
        temp = data[i-1]; data[i-1] = data[i]; data[i] = temp;
        last = i;
      }
      --i;
    }
    if(last == l) return;
    l = last;
  }
}

挿入ソート

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

シェルソート

function shellSort(data) {
  var n = data.length, h, i, j, temp, k;
  for(h = 1; h < n; h = h * 3 + 1)
    ;
  while(1 < h) {
    h = h / 3 | 0;
    for(i = 0; i < h; ++i) {
      for(j = i + h; j < n; j += h) {
        temp = data[j];
        for(k = j; k > i && data[k-h] > temp; k -= h) {
          data[k] = data[k-h];
        }
        data[k] = temp;
      }
    }
  }
}

選択ソート

function selectionSort(data) {
  var n = data.length, i, minIdx, j, temp;
  for(i = 0; i < n; ++i) {
    minIdx = i;
    for(j = i + 1; j < n; ++j) {
      if(data[minIdx] > data[j]) {
        minIdx = j;
      }
    }
    temp = data[minIdx]; data[minIdx] = data[i]; data[i] = temp;
  }
}

マージソート

function mergeSort(array) {
  var n = array.length;
  if (n < 2) return array;
  var m = n / 2 | 0;
  var array1 = array.slice(0, m);
  var array2 = array.slice(m);
  mergeSort(array1);
  mergeSort(array2);
  
  var i = 0;
  var j = 0;
  var k = 0;
  n = array1.length;
  m = array2.length;
  while (i < n && j < m) {
    if (array1[i] > array2[j]) {
      array[k++] = array2[j++];
    } else {
      array[k++] = array1[i++];
    }
  }
  
  if (i < n) {
    do {
      array[k++] = array1[i++];
    } while (i < n);
  } else if (j < m) {
    do {
      array[k++] = array2[j++];
    } while (j < m);
  }
  
  return array;
}