自己看的算法纲要

来源:互联网 发布:米兔积木机器人 编程 编辑:程序博客网 时间:2024/06/05 22:55

基本排序算法 

选择排序

选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续。这个过程一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。 



function selectionSort() {    var min, temp;    for (var outer = 0; outer <= this.dataStore.length-2; ++outer) {        min = outer;        for (var inner = outer + 1;inner <= this.dataStore.length-1; ++iner) {             if (this.dataStore[inner] < this.dataStore[min]) {                   min = inner;              }             swap(this.dataStore, outer, min);         }    } }

插入排序

插入排序类似于人类按数字或字母顺序对数据进行排序。例如,让班里的每个学生上交一张写有他的名字、学生证号以及个人简介的索引卡片。学生交上来的卡片是没有顺序的,但是我想让这些卡片按字母顺序排好,这样就可以很容易地与班级花名册进行对照了。

我将卡片带回办公室,清理好书桌,然后拿起第一张卡片。卡片上的姓氏是 Smith。我把它放到桌子的左上角,然后再拿起第二张卡片。这张卡片上的姓氏是 Brown。我把 Smith移右,把 Brown 放到 Smith 的前面。下一张卡片是 Williams,可以把它放到桌面最右边,而不用移动其他任何卡片。下一张卡片是 Acklin。这张卡片必须放在这些卡片的最前面,因此其他所有卡片必须向右移动一个位置来为 Acklin 这张卡片腾出位置。这就是插入排序的排序原理。

插入排序有两个循环。外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那么数组元素会向右移动,为内循环中的这个元素腾出位置,就像之前介绍的姓氏卡片一样。 



function insertionSort() {   var temp, inner;   for (var outer = 1; outer <= this.dataStore.length - 1; ++outer) {       temp = this.dataStore[outer];       inner = outer;       while (inner > 0 && (this.dataStore[inner - 1] >= temp)) {         this.dataStore[inner] = this.dataStore[inner - 1];  --inner;        }       this.dataStore[inner] = temp;   }}


高级排序算法 

希尔排序

它会首先比较距离较远的元素,而非相邻的元素。和简单地比较相邻元素相比,使用这种方案可以使离正确位置很远的元素更快地回到合适的位置。当开始用这个算法遍历数据集时,所有元素之间的距离会不断减小,直到处理到数据集的末尾,这时算法比较的就是相邻元素了。 

希尔排序的工作原理是,通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔。我们可以动态定义间隔序列,不过对于大部分的实际应用场景,算法要用到的间隔序列可以提前定义好。 


function shellsort() {    for (var g = 0; g < this.gaps.length; ++g) {        for (var i = this.gaps[g]; i < this.dataStore.length; ++i) {             var temp = this.dataStore[i];             for (var j = i; j >= this.gaps[g] &&this.dataStore[j-this.gaps[g]] > temp;j -= this.gaps[g]) {                  this.dataStore[j] = this.dataStore[j - this.gaps[g]];             }             this.dataStore[j] = temp;         }    } }


归并排序  

采用非递归或者迭代版本的归并排序是一个自底向上的过程。这个算法首先将数据集分解为一组只有一个元素的数组。然后通过创建一组左右子数组将它们慢慢合并起来,每次合并都保存一部分排好序的数据,直到最后剩下的这个数组所有的数据都已完美排序 

把一系列排好序的子序列合并成一个大的完整有序序列 




快速排序  

快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。该算法不断重复这个步骤直到所有数据都是有序的。

这个算法首先要在列表中选择一个元素作为基准值(pivot)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部,将大于基准值的元素移到数组的顶部。 



(1) 选择一个基准元素,将列表分隔成两个子序列;
(2) 对列表重新排序,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元

素放在基准值的后面;
(3) 分别对较小元素的子序列和较大元素的子序列重复步骤1 2。 


function qSort(list) {    if (list.length == 0) {        return [];     }    var lesser = [];    var greater = [];    var pivot = list[0];    for (var i = 1; i < list.length; i++) {         if (list[i] < pivot) {             lesser.push(list[i]);         } else {             greater.push(list[i]);         }     }    return qSort(lesser).concat(pivot, qSort(greater));}