关于排序算法

看到排序,很多人会一下子就想到冒泡算法,因为它在所有排序算法中最简单。然而,从运行时间的角度来看,冒泡排序是最差的一个 。


 首先这里定义一下全局:

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.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.选择排序

 选择排序算法是一种原址比较排序算法。选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。

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.插入排序

插入排序每次排一个数组项,以此方式构建最后的排序数组。假定第一项已经排序了,接着,它和第二项进行比较,第二项是应该待在原位还是插到第一项之前呢?这样,头两项就已正确排序,接着和第三项比较(它是该插入到第一、第二还是第三的位置呢?),以此类推。 

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) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。 

 

posted @ 2017-07-20 14:40  RemateDanpike  阅读(176)  评论(0编辑  收藏  举报