排序算法的实现

我的JS水平是渣渣,所以我用一种排序算法,编写Javascript在某种程度上类似于java和c

这里我不讲算法原理,只是代码实现,可能有bug,欢迎大家的博客评论指导。

插入排序

的插入排序算法描述(插入排序)是一个简单而直观的排序算法。它的工作原理是找到相应的位置,将无序的数据通过有序序列的构造和向后扫描在有序序列,插入排序通常是由地方的排序(即排序只是额外的空间需要O(1))。因此,在向前扫描的过程中,我们需要一步一步地移动排序的元素,以提供最新元素的插入空间。

实现代码如下所示:


函数插入排序(ARR){
如果(!ARR)返回;
VaR len = arr.length;
如果(len = 0 | | len = = 1)返回;

对于(var i = 1,len = arr.length;我< len;i++){
VaR站= ARR {我};
对于(var j = i 1;j = 0;j){
如果(ARR { J } >站){
{ 1 } = J + ARR ARR {,};
{人}
ARR { } =站j + 1;
打破;
}
}
}

报酬;
}






时间复杂度是:o(n = 2)

当然,该算法进行了优化,例如,将搜索和替换位置算法更改为两个点查找。

冒泡排序

经典的排序算法,指冒泡排序,我很心痛。在本科阶段,必须对论文中的冒泡排序算法进行改进,写论文后的结果不能完成冒泡排序算法,这是令人尴尬的。


如果(!ARR)返回;
VaR len = arr.length;
如果(len = 0 | | len = = 1)返回;

对于(var i = 0;i < i;i + +){
对于(var j=0;j i i - 1;j + +){
如果(ARR { J } > ARR { j + 1 }){
var tmp = { 1 }度{J}.;
{ 1 } = J + ARR ARR {,};
ARR { } = TMP {J}.;
}
}
}

报酬;
}






时间复杂度是:o(n = 2)

快速排序

非常经典的排序算法,主要分为三个排序过程:

从序列中挑选一个元素,称为枢轴;
重新排序序列,所有元素小于参考值的所有元素都放在参考的前面,比基准中摆的参考值(任何一个边都是相同的数字);
递归(递归)的子数柱,小于基准值元素和子数柱,大于基准值元素分类。


实现代码如下所示:


功能快速排序(ARR,BT,ED){
如果(bt < ED){
VaR支点= findpartition(ARR,BT,ED);
QuickSort(ARR,BT,枢轴- 1);
QuickSort(ARR,支点+ 1,ED);
}
}

功能findpartition(ARR,BT,ED){
VaR站= ARR BT } {;

当(bt < ED){
当(bt =站){
ed;
}
如果(bt < ED){
ARR { BT + } = { } ARR ED;
}
而(BT版<< ARR { } <= BT站){
bt +;
}
如果(bt < ED){
ARR { ED = ARR { BT } *;
}
}

{转} =站到达;
返回BT;
}






时间复杂度为O(nlogn)。

归并排序

这是一个非常经典的排序算法,我只是通过学习JS来复习经典的排序算法。合并排序的思想可以参考我的博客:合并排序。


function mergeSort(ARR,BT,ED){
如果(bt < ED){
VaR中= BT + parseInt((艾德- BT) / 2);
MergeSort(ARR,BT,MID);
MergeSort(ARR,中秋+ 1,ED);
mergearray(ARR,BT,中旬,ED);
}
}

功能mergearray(ARR,BT,中旬,ED){
VaR马尔= { };
var i = BT,j =中+ 1;
当(i =中j = ED){
如果(ARR {我} { } { ARR J)
MArr.push(ARR {我+ });
{人}
MArr.push(ARR { J++ });
}
}

如果(i中){
马尔= marr.concat(arr.slice(我,中秋+ 1));
}

如果(J ED){
马尔= marr.concat(arr.slice(J,ED+1));
}

对于(var H = 0;h<marr.length;H + +){
ARR { BT + H } =马尔{H};
}
}






写归并排序和一个小插曲:JS是不会自动取整,然后使用parseInt方法,感觉孟梦达。