javascript数据结构与算法--高级排序算法

高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个。现在我们来学习下2种高级排序算法---- 希尔排序和快速排序。

一:希尔排序;

希尔排序的核心理念是:首先比较距离较远的元素,而非相邻的元素。

基本原理:通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔。

下面我们来看看数组[0,9,1,8,7,6,2,3,5,4] 来使用希尔排序的原理;如下图:

代码分析如下:

1. 执行 "间隔序列=3的步骤"

A. 那么第一次执行 "间隔序列=3" 的步骤,那么找到位置间隔3的元素为 0 ,  8  , 2  , 4

所以这四个数字当中0最小,所以位置不动,还是第一个位置,8是最大的 所以位置就移动到之前的4的位置上,4移动到8的位置上,但是2和4比较 2小          于4的 所以2和4位置继续调换。所以现在的顺序为0 , 2 , 4  , 8,如上图(间隔序列=3)

B. 现在第二次执行 "间隔序列=3" 的步骤,找到元素为 9 , 7 , 3 分析还是和上面的一样 3是最小的,所以移动到原先9的位置上,9就移到到3的位置上,   由     于7小于9 所以不需要移动,所以现在的顺序为 3 , 7 , 9 如上图(间隔序列=3)

C. 现在第三次执行 "间隔序列=3"的步骤,找到元素 1 , 6 , 5 ,由于1是最小的 所以不需要移动,6大于5,所以2者要调换位置 所以顺序为 1 , 5  , 6

执行完上面的步骤后,正确的顺序为 [0,3,1,2,7,5,4,9,6,8]

2. 执行 "间隔序列=2"的步骤

A. 第一次查找 找到元素 0,1,7,4,6,所以原理还是和上面一样,0和1不需要移动 7和4及6调换位置,因此现在的顺序变为 0,1,4,6,7

B. 第二次查找 找到元素 3,2,5,9,8 ,所以顺序变为 2,3,5,8,9

执行完上面的步骤后,正确的顺序为 [0,2,1,3,4,5,6,8,7,9] 如上图(间隔序列=2)

3. 执行 "间隔序列=1"的步骤;

数组的顺序就变为 [0,1,2,3,4,5,6,7,8,9].如上图(间隔序列=1)

JS代码如下:

function CArray(numElements,gaps) {
this.dataStore = [];
this.pos = 0;
this.numElements = numElements;
this.gaps = gaps;
this.insert = insert;
this.toString = toString;
this.clear = clear;
this.shellSort = shellSort;
for(var i = 0; i < numElements.length; i++) {
this.dataStore[i] = numElements[i];
}
}
function clear() {
for(var i = 0; i < this.dataStore.length; i++) {
this.dataStore[i] = 0;
}
}
function insert(element) {
this.dataStore[this.pos++] = element;
}
function toString() {
var restr = "";
for(var i = 0; i < this.dataStore.length; i++) {
restr += this.dataStore[i] + " ";
if(i > 0 && i % 10 == 0) {
restr+= "\n";
}
}
return restr;
} 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;
}
}
}
// 希尔排序测试代码
var numElements = [0,9,1,8,7,6,2,3,5,4];
var gaps = [3,2,1];
var myNums = new CArray(numElements,gaps);
myNums.shellSort();
console.log(myNums.toString());

二:快速排序

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

这个算法首先要在列表中选择一个元素来作为基准值,数据排序围绕基准值进行,将列表中小于基准值的元素移动到数组的左边,将大于基准值的元素移动到数组的右边,如下图所示:

基本原理是:

  1. 选择一个基准元素,将列表分割成2个子序列。基准元素的选择可以有3种方式,可以选择第一个元素作为基准元素,也可以把中间的值作为基准元素,还可以把最后一个元素作为基准的元素。
  2. 对列表重新排序,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元素放在基准值的后面。
  3. 分别对较小元素的子序列和较大元素的子序列的重复步骤1和2.

下面是JS的代码如下:

// 快速排序
function qSort(list) {
if(list.length == 0) {
return [];
}
// 存储小于基准值的值
var left = [];
// 存储大于基准值的值
var right = [];
var pivot = list[0];
for(var i = 1; i < list.length; i++) {
if(list[i] < pivot) {
left.push(list[i]);
}else {
right.push(list[i])
}
}
return qSort(left).concat(pivot,qSort(right));
}
// 快速排序测试代码
var numElements = [44,75,23,43,55,12,64,77,33];
var list = qSort(numElements);
console.log(list); // [12, 23, 33, 43, 44, 55, 64, 75, 77]

javascript数据结构与算法--高级排序算法的更多相关文章

  1. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  2. 【高级排序算法】2、归并排序法的实现-Merge Sort

    简单记录 - bobo老师的玩转算法系列–玩转算法 -高级排序算法 Merge Sort 归并排序 Java实现归并排序 SortTestHelper 排序测试辅助类 package algo; im ...

  3. 【高级排序算法】1、归并排序法 - Merge Sort

    归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...

  4. JS中算法之排序算法

    1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...

  5. javascript高级排序算法之快速排序(快排)

    javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...

  6. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  7. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  8. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  9. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

随机推荐

  1. http 状态码含义

    HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧: 假如你看到一个状态码518, 你并不知道具体51 ...

  2. linux上安装subversion

    1.安装svn服务器端  yum install subversion       从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 安装成功提示:.....complete! 依次执行 ...

  3. [bootsrap]模态框使用例

    <a href="#modal1" role="button" class="btn btn-primary btn-sm" data ...

  4. [django]django xlrd处理xls中日期转换问题

    xlrd会把xls文件中比如20160--03-01类型的时间转换成整数,那么我们如何保证xlrd读取进来的时间为2016-03-01格式呢? 使用xlrd中的xldate_as_tuple函数 代码 ...

  5. 骨骼蒙皮动画算法(Linear Blending Skinning)

    交互式变形是编辑几何模型的重要手段,目前出现了许多实时.直观的交互式变形方法.本文介绍一种利用线性混合蒙皮(Linear Blending Skinning,LBS)技术来实现网格变形的方法,线性混合 ...

  6. 基于ionic+cordova+angularJs从零开始搭建自己的移动端H5 APP

    这里详细介绍下如何用ionic+cordova+angularjs搭建自己的移动端app,包括环境搭建,框架使用等,具体项目已放置在github上,可下载下来自行启动. 下载地址:https://gi ...

  7. C++中指针数组的分配与释放

    C++中可用new和delete关键字分配和释放内存,但是如果遇到指针数组(或指向指针的指针),分配和释放必须慎重,不然容易造成内存泄漏. 下面用一段代码给出如何使用指向指针的指针来分配和释放内存: ...

  8. git提交时支持文件名大小写的修改

    在windows环境下,git提交文件时,默认对文件名大小写不敏感,若修改了文件名字的大小写,可能会导致提交时没有记录,文件名修改不成功.网上搜集了几种解决方法,现总结下: 1. 修改git conf ...

  9. 6款程序员不得不爱的bootstrap模板

    Bootstrap是基于jQuery框架开发的,它在jQuery框架的基础上进行了更为个性化和人性化的完善,形成一套自己独有的网站风格,并兼容大 部分jQuery插件.Bootstrap中包含了丰富的 ...

  10. 记一次排错,windows日志 模块 DLL C:\Windows\system32\inetsrv\aspnetcore.dll 未能加载。返回的数据为错误信息。

    这个错误是在我本地开发环境,不是生产环境,如果是生产环境我就挂了....开发环境也痛苦啊,重装系统的话,我估计装系统+所有软件,少说也得1天..... 错误产生:重装IIS (尼玛,IIS总有一个小毛 ...