您的位置:首页 > Web前端 > JavaScript

排序算法研究

2016-07-30 18:15 176 查看
在学习JavaScript的数组时,我们知道排序有一个sort()方法,但是sort方法对数组成员进行排序时,默认的是按照字典顺序排序,即按照acsii码表来排序。但是这并不能满足我们对一组无需数字进行排序的要求,所以对排序算法进行了学习,并用代码实现。

冒泡排序(Bubble Sort):

它的基本思想是:

1、依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位;

2、再对最后一位以外的数组,重复前面的过程,直至全部排序完成;

代码实现(从小到大排序):
<span style="font-size:18px;">   <function bubbleSort(arr){
for(var i=1;i<arr.length;i++){
for(var j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){//比较相邻两数的大小,若前者大于后者,则交换位置,使最大的数排到最后
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}</span>


快速排序:

“快速排序”的思想很简单,整个排序过程只需要三步:

(1)在数据集之中,选择一个元素作为"基准"(pivot)。

(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说,现在有一个数据集{88, 22, 63, 45, 13, 37, 95, 50},怎么对其排序呢?

第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解)

88, 22, 63,
45, 13, 37, 95, 50
第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45"另一个"大于等于45"

22,13,37,45, 88,63,95,50

第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止

22,13,37, 45,88,63,95,50

13,22,37, 45, 50,63,88,95

13,22,37, 45, 50,63,88,95   

13,22,37,45,50,63,88,95


代码实现:
<span style="font-size:18px;">function quickSort(arr){
if(arr.length<=1){return arr;}//检查数组个数,如果小于等于1,直接返回
var baseIndex=Math.floor(arr.length/2);//选择数组中间值作为“基准”
var baseValue=arr.splice(baseIndex,1)[0];//选择“基准”,并将其与原数组分离
var left=[];//定义两个空数组,用来存放两个子集
var right=[];
for(var i=0;i<arr.length;i++){//遍历数组,小于“基准”的放左边,大于“基准”的放右边
if(arr[i]>baseValue){
right.push(arr[i]);
}else{
left.push(arr[i]);
}
}
return quickSort(left).concat(baseValue,quickSort(right));//递归方法重复这个过程,知道排序完成
}</span>

直接插入排序:

基本思想:
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。

代码实现:
<span style="font-size:18px;">  function insertSort(arr){
for(var i=1;i<arr.length;i++){
var temp=arr[i];
for(var j=i-1;j>=0&&temp<arr[j];j--){
arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
return arr;
}</span>


水平有限,以上算法可能解释的不是很清楚,欢迎大家评论,互相交流哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息