高级排序算法:(处理大数据:百万以上)

  • 希尔排序:是插入排序的优化版;

    • 首先设置间隔数组,然后按照每个间隔,分别进行排序;
    • 如第一个间隔为5,首先a[5]与a[0]进行插入排序;然后a[6]和a[0],a[1]进行插入排序,直到最后一个;
    • 然后换下一个间隔值,直到所有间隔值排序完(当间隔值为1时,就是一般的插入排序);
    • 效果:

首先在类中添加间隔数组:
this.gaps = [5,3,1];
然后添加函数:
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;
}
}
}

demo: 

  • 动态计算的希尔排序:
 function shellsort1() {
var N = this.dataStore.length,h = 1;
while(h < N/3) {
h = 3 * h + 1;
}
while(h > 0) {
for(var i = h; i < N; ++i) {
for(var j = i; j >= h && this.dataStore[j] < this.dataStore[j-h]; j -= h) {
swap(this.dataStore, j ,j-h);
}
}
h = (h-1)/3;
}
}

demo:

两个希尔排序的效率是一样的;

  • 归并排序:把一系列排好序的子序列合并成一个大的完整有序的序列;在实际中实现时有个问题,就是在处理大数据的时候需要有足够的空间暂存;归并排序一般用递归实现,但这个方法在JS不太可行,所以采用一种非递归的方法实现;

    • 首先将数据分成一组只有一个数据的数组;
    • 然后通过创建一组左右字数组将他们合并;
    • 每次合并都保存一部分排好序的数据,直到最后剩下的数组都是已经排好序的;

function mergeSort() {
var arr = this.dataStore,
length = arr.length;
if(length < 2) {
return;
}
var step = 1;
var left = step;
while(step < length) {
left = 0;
right = step;
while(right + step <= length) {
mergeArray(arr,left,left + step,right,right + step);
left = right + step;
right = left + step;
}
if(right < length) {
this.mergeArray(arr,left,left + step,right,length);
}
step *= 2;
}
}
function mergeArray(arr,startLeft,stopLeft,startRight,stopRight) {
var rightArr = new Array(stopRight - startRight + 1); //创建临时存储数组
var leftArr = new Array(stopLeft - startLeft + 1); //创建临时存储数组
k = startRight;
for(var i = 0; i < rightArr.length - 1; ++i) {
rightArr[i] = arr[k]
++k;
}
k = startLeft;
for(var i = 0; i < leftArr.length - 1; ++i) {
leftArr[i] = arr[k];
++k;
}
rightArr[rightArr.length - 1] = Infinity;
leftArr[leftArr.length -1] = Infinity;
var m = 0, n = 0;
for(var k = startLeft; k < stopRight; ++k) {
if(leftArr[m] <= rightArr[n]) {
arr[k] = leftArr[m];
++m;
} else {
arr[k] = rightArr[n];
++n;
}
}
}

demo;

  • 快速排序:处理大数据最快的排序算法之一;它是一种分而治之的算法;

    • 选择一个基准元素,将数列分隔成两个子序列;
    • 对数组重新排序,将所有小于基准的元素放在基准前面,大于的放在后面,这个称为分区操作;
    • 对两个分区重复上述步骤,直到无法继续;
    • 效果:

function qSort(arr) {  //注意这里并没有将方法写进类当中
var length = arr.length;
if(arr.length === 0) {
return [];
}
var left = [], right = [], pivot = arr[0];
for(var i = 1; i < length; ++i) {
if(arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return qSort(left).concat(pivot,qSort(right));
}

demo

js:数据结构笔记12--排序算法(2)的更多相关文章

  1. js:数据结构笔记11--排序算法(1)

    基本准备: function CArray(numElems) { this.dataStore = []; this.pos = 0; this.numElems = numElems; this. ...

  2. js:数据结构笔记13--检索算法

    顺序查找:也称线性查找,暴力查找的一种 基本格式: var nums = []; for(var i = 0; i < 10; ++i) { nums[i] = Math.floor(Math. ...

  3. js学习笔记之排序算法的原理及代码

    冒泡排序 比较任何两个相邻的项,如果第一个比第二个大,则交换它们 重复这样的操作,直到排序完成,具体代码如下: let arr = [67,23,11,89,45,76,56,99] function ...

  4. js:数据结构笔记14--高级算法

    动态规划: 递归是从顶部开始将问题分解,通过解决所有分解出小问题来解决整体问题: 动态规划从底部开始解决问题,将所有小问题解决,然后合并掉一个整体解决方案: function dynFib(n) { ...

  5. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  6. 使用 js 实现十大排序算法: 堆排序

    使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...

  7. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  8. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

随机推荐

  1. matlab 之cov 协方差

    COV 1.cov(x) 如果x为向量,返回x的方差 计算方法为: S为方差. 2.cov(X) 如果X为矩阵,把矩阵X的行作为观察值,把列作为变量,返回X的协方差矩阵: diag(cov(X))是每 ...

  2. Integer Inquiry

    Integer Inquiry Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Sub ...

  3. CH round #55 Streaming #6

    T^T Saffah大神照样刷我这样诚心诚意想做一套NOIP模拟题的蒟蒻. 第一题 九九归一 好diao的名字... 题意就是给定一队$n,q$,求在模$n$意义下一个数$x$自乘的循环节长度. 当$ ...

  4. 又一款linux提权辅助工具

    又一款linux提权辅助工具 – Linux_Exploit_Suggester 2013-09-06 10:34 1455人阅读 评论(0) 收藏 举报 https://github.com/Pen ...

  5. VMware Snapshot 工作原理

    VMware中的快照是对VMDK在某个时间点的“拷贝”,这个“拷贝”并不是对VMDK文件的复制,而是保持磁盘文件和系统内存在该时间点的状态,以便在出现故障后虚拟机能够恢复到该时间点.如果对某个虚拟机创 ...

  6. "int?" 是什么类型?和"int"有何区别

    int?:表示可空类型,就是一种特殊的值类型,它的值可以为null用于给变量设初值得时候,给变量(int类型)赋值为null,而不是0int??:用于判断并赋值,先判断当前变量是否为null,如果是就 ...

  7. Count Primes

    Count the number of prime numbers less than a non-negative number, n public int countPrimes(int n) { ...

  8. Web Components之Custom Elements

    什么是Web Component? Web Components 包含了多种不同的技术.你可以把Web Components当做是用一系列的Web技术创建的.可重用的用户界面组件的统称.Web Com ...

  9. 71 Query Rank Min Max Successor of BST

    [本文链接] http://www.cnblogs.com/hellogiser/p/query-min-max-successor-of-bst.html [代码]  C++ Code  12345 ...

  10. discuz 帖子模块用到的表及自动发帖函数

    最近在做一个discuz的插件,由于需要程序自动生成并调用discuz已经存在插件的帖子.然而这就相当于自动发帖的功能了.网上找了一下,大部分都是通过curl模拟登陆,模拟发帖的,这显然不满足我的要求 ...