javascript排序各種演算法例項程式碼

admin發表於2017-03-14

對於排序的演算法有很多種,下面是一個來源於網路上的附有各種演算法例項的程式碼,有興趣的朋友可以自行分析一下,這裡就不做介紹了,程式碼例項如下:

[HTML] 純文字檢視 複製程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script type="text/javascript"> 
Array.prototype.swap = function(i, j) 
{ 
  var temp = this[i];
  this[i] = this[j];
  this[j]=temp; 
} 
 
Array.prototype.bubbleSort=function() 
{ 
  for(var i=this.length-1;i>0;--i) 
  { 
    for(var j=0;j<i;++j) 
    { 
      if(this[j] > this[j + 1]) this.swap(j, j + 1); 
    } 
  } 
} 
 
Array.prototype.selectionSort=function() 
{ 
  for(var i=0;i<this.length;++i) 
  { 
    var index=i; 
    for(var j=i+1;j<this.length;++j) 
    { 
      if(this[j]<this[index]) index = j; 
    } 
    this.swap(i, index); 
  } 
} 
 
Array.prototype.insertionSort=function() 
{ 
  for(var i=1;i<this.length;++i) 
  { 
    var j=i,value=this[i]; 
    while(j>0&&this[j-1]>value) 
    { 
      this[j] = this[j - 1]; 
      --j; 
    } 
    this[j] = value; 
  } 
} 
 
Array.prototype.shellSort=function() 
{ 
  for(var step=this.length>>1; step > 0; step >>= 1) 
  { 
    for (var i = 0; i < step; ++i) 
    { 
      for (var j = i + step; j < this.length; j += step) 
      { 
        var k = j, value = this[j]; 
        while (k >= step && this[k - step] > value) 
        { 
          this[k] = this[k - step]; 
          k -= step; 
        } 
        this[k] = value; 
      } 
    } 
  } 
} 
 
Array.prototype.quickSort = function(s, e) 
{ 
  if (s == null) s = 0; 
  if (e == null) e = this.length - 1; 
  if (s >= e) return; 
  this.swap((s + e) >> 1, e); 
  var index = s - 1; 
  for (var i = s; i <= e; ++i) 
  { 
    if(this[i] <= this[e]) this.swap(i, ++index); 
  } 
  this.quickSort(s, index - 1); 
  this.quickSort(index + 1, e); 
} 
 
Array.prototype.stackQuickSort = function() 
{ 
  var stack = [0, this.length - 1]; 
  while (stack.length > 0) 
  { 
    var e = stack.pop(), s = stack.pop(); 
    if (s >= e) continue; 
    this.swap((s + e) >> 1, e); 
    var index = s - 1; 
    for (var i = s; i <= e; ++i) 
    { 
      if (this[i] <= this[e]) this.swap(i, ++index); 
    } 
    stack.push(s, index - 1, index + 1, e); 
  } 
} 
 
Array.prototype.mergeSort = function(s, e, b) 
{ 
  if (s == null) s = 0; 
  if (e == null) e = this.length - 1; 
  if (b == null) b = new Array(this.length); 
  if (s >= e) return; 
  var m = (s + e) >> 1; 
  this.mergeSort(s, m, b); 
  this.mergeSort(m + 1, e, b); 
  for (var i = s, j = s, k = m + 1; i <= e; ++i) 
  { 
    b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++]; 
  } 
  for (var i = s; i <= e; ++i) this[i] = b[i]; 
} 
 
Array.prototype.heapSort = function() 
{ 
  for (var i = 1; i < this.length; ++i) 
  { 
    for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1) 
    { 
      if (this[k] >= this[j]) break; 
      this.swap(j, k); 
    } 
  } 
  for (var i = this.length - 1; i > 0; --i) 
  { 
    this.swap(0, i); 
    for (var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1) 
    { 
      if (k == i || this[k] < this[k - 1]) --k; 
      if (this[k] <= this[j]) break; 
      this.swap(j, k); 
    } 
  } 
} 
 
function generate() 
{ 
  var max = parseInt(txtMax.value), count = parseInt(txtCount.value); 
  if (isNaN(max) || isNaN(count)) 
  { 
    alert("個數和最大值必須是一個整數"); 
    return; 
  } 
  var array = []; 
  for (var i = 0; i < count; ++i) array.push(Math.round(Math.random() * max)); 
  txtInput.value = array.join("\n"); 
  txtOutput.value = ""; 
} 
 
function demo(type) 
{ 
  var array = txtInput.value == "" ? [] : txtInput.value.replace().split("\n"); 
  for (var i = 0; i < array.length; ++i) array[i] = parseInt(array[i]); 
  var t1 = new Date(); 
  eval("array." + type + "Sort()"); 
  var t2 = new Date(); 
  lblTime.innerText = t2.valueOf() - t1.valueOf(); 
  txtOutput.value = array.join("\n"); 
} 
</script>
</head>
<body onload=generate()>
<table style="font-size:12px">
  <tr>
    <td align=right><textarea id=txtInput readonly></textarea></td>
    <td width=150 align=center> 隨機數個數
      <input id=txtCount value=500 >
      最大隨機數
      <input id=txtMax value=1000>
      <button onclick=generate()>重新生成</button>
      耗時(毫秒)<label id=lblTime></label>
      <button onclick=demo("bubble")>氣泡排序</button>
      <button onclick=demo("selection")>選擇排序</button>
      <button onclick=demo("insertion")>插入排序</button>
      <button onclick=demo("shell")>謝爾排序</button>
      <button onclick=demo("quick")>快速排序(遞迴)</button>
      <button onclick=demo("stackQuick")>快速排序(堆疊)</button>
      <button onclick=demo("merge")>歸併排序</button>
      <button onclick=demo("heap")>堆排序</button></td>
    <td align=left><textarea id=txtOutput readonly style="width:100px;height:100%"></textarea></td>
  </tr>
</table>
</body>
</html>

相關文章