基本准备:

  function  CArray(numElems) {
this.dataStore = [];
this.pos = 0;
this.numElems = numElems;
this.insert = insert;
this.toString = toString;
this.clear = clear;
this.setData = setData;
this.swap =swap;
for(var i = 0; i < numElems; ++i) {
this.dataStore[i] = i;
}
}
function setData() {
for(var i = 0; i < this.numElems; ++i) {
this.dataStore[i] = Math.floor(Math.random() * 100);//0-99
}
}
function clear() {
for (var i = 0; i < this.numElems; ++i) {
this.dataStore[i] = 0;
}
}
function insert(elem) {
this.dataStore[this.pos++] = elem;
}
function toString() {
var str = "";
for(var i = 0; i < this.dataStore.length; ++i) {
str += this.dataStore[i] + " ";
if( i > 0 && (i+1) %10 === 0) {
str += "\n";
}
}
return str;
}
function swap(arr,index1,index2) {
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}

 基本排序算法:

  • 冒泡排序:最容易实现也是最慢的算法之一

    • 从头开始依次分别比较相邻的两个元素并排序,直到最后一个;此时确定最后一个会是最大的;
    • 重复上面步骤但不比较已经确定的,此时确定最后第二个是第二大的;
    • 继续重复直到剩下第一个元素为止,确定它是最小的;

效果:

  function bubbleSort() {
var numElems = this.dataStore.length;
var temp;
for(var outer = numElems; outer > 1 ; --outer) {
for(var inner = 0; inner < outer; ++inner) {
if(this.dataStore[inner] > this.dataStore[inner + 1]) {
swap(this.dataStore,inner,inner + 1);
}
}
}
}

demo:

  • 选择排序:也是简单的算法之一

    • 从未排序的数列开头开始向后一个个比较,找到一个比它小的值,交互位置;
    • 用刚交互的值从它被替换的位置开始继续向后比较,重复直到比较到最后一个值,此时最前面的值为这次排序找出的最小值,确定它排序;
    • 继续从剩下的未确定排序的数列从头开始重复,找到最小值放到前面第二个个位置,重复;
    • 继续,直到只剩最后一个数值;
    • 效果:

  function selectionSort() {
var min,temp;
for(var outer = 0; outer < this.dataStore.length-1; ++outer) { //不和自己比较减一
min = outer;
for(var inner = outer+1; inner < this.dataStore.length; ++inner) { //和已确定排序的个数叫要比较的一个比较
if(this.dataStore[inner] < this.dataStore[min]) {
swap(this.dataStore,inner,min);
}
}
}
}

demo:

  • 插入排序:也是简单的算法之一,特别是在对已经排好序的数据操作时效率高;

    • 开头的第一个元素为确定排序,从第二个元素开始,在确定的排序数列中从后往前比较;
    • 如果大于被比较的数值,则插入其后面,反之则继续往前比较;
    • 当第二个元素插入到适当位置后,第三个元素继续重复;
    • 继续,直到最后一个元素;
    • 效果:

 function insertionSort() {
var temp,inner;
for(var outer = 1; outer < this.dataStore.length; ++outer) {
temp = this.dataStore[outer];
inner = outer;
while(inner > 0 && (this.dataStore[inner - 1] > temp)) {
this.dataStore[inner] = this.dataStore[inner - 1]; //这里不是单纯的交互,不用swap
--inner;
}
this.dataStore[inner] = temp;
}
}

demo:

一般来讲三种算法速度:插入>选择>冒泡;

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

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

    高级排序算法:(处理大数据:百万以上) 希尔排序:是插入排序的优化版: 首先设置间隔数组,然后按照每个间隔,分别进行排序: 如第一个间隔为5,首先a[5]与a[0]进行插入排序;然后a[6]和a[0] ...

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

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

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

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

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

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

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

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

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

随机推荐

  1. HNU 12826 Balloons Colors

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12826&courseid=268 #include&l ...

  2. 专注docker安全:Security Scanning

    导读 Docker毫无疑问是近期运维同学们的热点话题,Docker安全也由此倍受重视,Docker Security Scanning 是一款Docker镜像扫描的安全工具,目前已经在Docker C ...

  3. Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏

    著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能 ...

  4. HDU 1978 记忆化搜索(dfs+dp)

    Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  5. HDOJ 1272 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. 《C#高级编程》学习笔记------C#中的委托和事件(续)

    本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...

  7. 关于https和数字证书的一些必须知识

    下面这篇文章叫做  HTTPS连接的前几毫秒发生了什么 ,是一篇译文,写得不错,十分有助于理解https. http://blog.jobbole.com/48369/ 下面的链接是百度文库的 数字证 ...

  8. FFmpeg Filters Images 参数及效果图

    FFmpeg Filters Images 参数及效果图(chm) 下载 ffmpeg filters images 352 si.chm (27.98M) 下载 ffmpeg filters onl ...

  9. DP:Bridging Signals(POJ 1631)

    不能交叉的引脚 (这一题的难度在于读题)题目大意:有一堆引脚(signals),左边一排,右边一排,左边从上到下,对应着连接右边的引脚(所有的引脚都被接上),现在引脚之间的连线有交叉,我们要桥接这些交 ...

  10. codeforces A. Domino 解题报告

    题目链接:http://codeforces.com/problemset/problem/353/A 题目意思:通俗地说,就是当上下两半的数的总和不完全是偶数时,通过上下调换某些骨牌来使这两半的数和 ...