JavaScript希尔排序、快速排序、归并排序算法

以var a = [4,2,6,3,1,9,5,7,8,0];为例子。

1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。

function shellsort(arr){
  var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp;
  while(gap>0){
    for (var k = 0; k < gap; k++) {
      var tagArr = [];
      tagArr.push(arr[k])
      for (i = k+gap; i < len; i=i+gap) {
        temp = arr[i];
        tagArr.push(temp);
        for (j=i-gap; j >-1; j=j-gap) {
          if(arr[j]>temp){
            arr[j+gap] = arr[j];
          }else{
            break;
          }
        }
        arr[j+gap] = temp;
      }
      console.log(tagArr,"gap:"+gap);//输出当前进行插入排序的数组。
      console.log(arr);//输出此轮排序后的数组。
    }
    gap = parseInt(gap/2);
  }
  return arr;
}

过程输出:

[4, 9] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[2, 5] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[6, 7] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[3, 8] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[1, 0] "gap:5"
[4, 2, 6, 3, 0, 9, 5, 7, 8, 1]
[4, 6, 0, 5, 8] "gap:2"
[0, 2, 4, 3, 5, 9, 6, 7, 8, 1]
[2, 3, 9, 7, 1] "gap:2"
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9]
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1"
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

由输出可以看到。第一轮间隔为5。依次对这些间隔的数组插入排序。
间隔为5:

[4, 9] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[2, 5] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[6, 7] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[3, 8] "gap:5"
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0]
[1, 0] "gap:5"
[4, 2, 6, 3, 0, 9, 5, 7, 8, 1]
[4, 6, 0, 5, 8] "gap:2"
[0, 2, 4, 3, 5, 9, 6, 7, 8, 1]
[2, 3, 9, 7, 1] "gap:2"
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9]
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1"
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

间隔为2:

[4, 2, 6, 3, 0, 9, 5, 7, 8, 1]
 4   6   0   5   8
  2   3   9   7   1 

排序后:
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9]

间隔为1:
排序后:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

2.快速排序。把一个数组以数组中的某个值为标记。比这个值小的放到数组的左边,比这个值得大的放到数组的右边。然后再递归 对左边和右边的数组进行同样的操作。直到排序完成。通常以数组的第一个值为标记。
代码:

function quickSort(arr){
  var len = arr.length,leftArr=[],rightArr=[],tag;
  if(len<2){
    return arr;
  }
  tag = arr[0];
  for(i=1;i<len;i++){
    if(arr[i]<=tag){
      leftArr.push(arr[i])
    }else{
      rightArr.push(arr[i]);
    }
  }
  return quickSort(leftArr).concat(tag,quickSort(rightArr));
}

3.归并排序。把一系列排好序的子序列合并成一个大的完整有序序列。从最小的单位开始合并。然后再逐步合并合并好的有序数组。最终实现归并排序。
合并两个有序数组的方法:

function subSort(arr1,arr2){ 

  var len1 = arr1.length,len2 = arr2.length,i=0,j=0,arr3=[],bArr1 = arr1.slice(),bArr2 = arr2.slice(); 

  while(bArr1.length!=0 || bArr2.length!=0){
    if(bArr1.length == 0){
      arr3 = arr3.concat(bArr2);
      bArr2.length = 0;
    }else if(bArr2.length == 0){
      arr3 = arr3.concat(bArr1);
      bArr1.length = 0;
    }else{
      if(bArr1[0]<=bArr2[0]){
        arr3.push(bArr1[0]);
        bArr1.shift();
      }else{
        arr3.push(bArr2[0]);
        bArr2.shift();
      }
    }
  }
  return arr3;
} 

归并排序:

function mergeSort(arr){
  var len= arr.length,arrleft=[],arrright =[],gap=1,maxgap=len-1,gapArr=[],glen,n;
  while(gap<maxgap){
    gap = Math.pow(2,n);
    if(gap<=maxgap){
      gapArr.push(gap);
    }
    n++;
  }
  glen = gapArr.length;
  for (var i = 0; i < glen; i++) {
    gap = gapArr[i];
    for (var j = 0; j < len; j=j+gap*2) {
      arrleft = arr.slice(j, j+gap);
      arrright = arr.slice(j+gap,j+gap*2);
      console.log("left:"+arrleft,"right:"+arrright);
      arr = arr.slice(0,j).concat(subSort(arrleft,arrright),arr.slice(j+gap*2));
    }
  }
  return arr;
}

排序[4,2,6,3,1,9,5,7,8,0]输出:

left:4 right:2
left:6 right:3
left:1 right:9
left:5 right:7
left:8 right:0
left:2,4 right:3,6
left:1,9 right:5,7
left:0,8 right:
left:2,3,4,6 right:1,5,7,9
left:0,8 right:
left:1,2,3,4,5,6,7,9 right:0,8

看出来从最小的单位入手。
第一轮先依次合并相邻元素:4,2;  6,3; 1,9; 5,7; 8,0
合并完成之后变成: [2,4,3,6,1,9,5,7,0,8]
第二轮以2个元素为一个单位进行合并:[2,4],[3,6];    [1,9],[5,7];    [0,8],[];
合并完成之后变成:[2,3,4,6,1,5,7,9,0,8]
第三轮以4个元素为一个单位进行合并:[2,3,4,6],[1,5,7,9];  [0,8],[]
合并完成之后变成: [1,2,3,4,5,6,7,9,0,8];
第四轮以8个元素为一个单位进行合并: [1,2,3,4,5,6,7,9],[0,8];
合并完成。 [0,1,2,3,4,5,6,7,8,9];

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • 基于JavaScript实现的快速排序算法分析

    本文实例讲述了基于JavaScript实现的快速排序算法.分享给大家供大家参考,具体如下: 首先要介绍一下冒泡排序,冒泡排序的过程很简单,首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个关键字交换,然后比较第二个和第三个,直到最后一个比较完成.这是第一趟冒泡,其结果使得关键字最大的记录被安置到最后一个位置上了.然后对序列前n-1个元素进行第二次冒泡,将倒数第二个选出.以此类推直到所有被选出,冒泡结束. 通过分析可以得出,冒泡排序的时间复杂度为O(n2). 快速排序是对冒泡

  • js实现数组冒泡排序、快速排序原理

    本文为大家分享了js数组冒泡排序.快速排序的实现原理,供大家参考,具体内容如下 1.冒泡排序: 随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果. var arr = [3,1,4,2,5,21,6,15,63]; function sortA(arr){ for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j+

  • JavaScript算法系列之快速排序(Quicksort)算法实例详解

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准"的左边:所有大于"基准"的元素,都移到"基准"的右边. (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止. 举例来说,现在有一个数据集{85, 24, 63, 45,

  • Javascript实现快速排序(Quicksort)的算法详解

    目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快.它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的. "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准"的左边:所有大于"基准"的元素,都移到"

  • JavaScript实现快速排序(自已编写)

    简述: 用到javascript的排序一组数字,js没有直接的数字比较的函数可以调用,所以自己写了一个快速排序 知识点: 1. 正则表达式提取正负数字的string 2. str 转数字 放回列表 3. js的对象Sort类的声明及定义 4. Sort类构造函数.成员函数定义方式(prototype) 5. 快速排序算法 代码: 复制代码 代码如下: <!DOCTYPE html> <meta http-equiv="Content-Type" content=&qu

  • JavaScript快速排序

    function quickSort() { function doSort(a,s,e) { if(stemp); if(s>e)break; var tem=a[s]; a[s]=a[e]; a[e]=tem; } a[st]=a[e]; a[e]=temp; return e; } doSort(this,0,this.length-1); return this; } Array.prototype.quickSort=quickSort; alert(new Array(5,2,4,6

  • js快速排序的实现代码

    但是有不少的书本讲得并不是很清楚,而且不同的教材的实现方式也不尽相同,我这里将最简单的快速排序的思路写出来供大家参考. 希望不管是使用什么语言都能从这个简单的代码里很方便的掌握快排思路与编写方式 复制代码 代码如下: function quick_sort(list, start, end) {        if (start < end) {          var pivotpos = partition(list, start, end);   //找出快排的基数          q

  • js对象数组按属性快速排序

    按所推荐的程序在IE下跑了下,的确,排序耗时很小. 复制代码 代码如下: <script> /* * 洗牌 */ function getRandomPlayCard(m){ var array1=new Array(m); for(var i=0;i<m;i++){ var rnd=Math.floor(Math.random()*(i+0.99999)) array1[i]=array1[rnd]; array1[rnd]=i; } return array1; }; /* * 快速

  • JS实现随机化快速排序的实例代码

    算法的平均时间复杂度为O(nlogn).但是当输入是已经排序的数组或几乎排好序的输入,时间复杂度却为O(n^2).为解决这一问题并保证平均时间复杂度为O(nlogn)的方法是引入预处理步骤,它惟一的目的是改变元素的顺序使之随机排序.这种预处理步骤可在O(n)时间内运行.能够起到同样作用的另一种简单方法是在算法中引入一个随机元素,这可以通过随机地选择拆分元素的主元来实现.随机选择主元的结果放宽了关于输入元素的所有排列的可能性相同的步骤.引入这一步来修正原先的快速排序,可得到下面所示的随机化快速排序

  • 深入理解JS实现快速排序和去重

    JS的快速排序和JS去重在面试的时候问的挺多的.下面是我对快速排序的理解,和快速排序,去重的代码. 1.什么是快速排序? 第一步: 快速排序就是去个中间值,把比中间值小的放在左边设为arrLeft,比中间值大的放在右边设为arrRight 第二步: 对arrLeft进行第一步,对arrRight进行第一步.(明显是一个递归嘛,当数组的长度小于2的时候结束) 第三步: 合并arrLeft,中间值,arrRight quickSort = function(arr){ if(arr.length <

  • Javascript快速排序算法详解

    快速排序是对冒泡排序的一种改进.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终达到整个数据变成有序序列. 假设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为基准数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对

随机推荐