JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序、快速排序、插入排序
时间:2014-01-09 18:05:51 来源: 作者:胡晗
冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上面,然后按照重量往下依次排列。
var a=[12,3,43,11,56,90,7,66,82];
拿上面的数组a举例,做一个升序排序。第一轮循环我们得把值最大的数从数组中找出来放在数组最后,即索引为a.length-1的位置。也就是从a[0]开始,依次往后比较相邻两个数的大小。
首先是a[0]和a[1]比较,如果a[0]>a[1],则交换两个数的位置,反之则不交换。a[0]是12,a[1]是3,所以得交换位置,交换完位置之后的数组是[3,12,43,11,56,90,7,66,82],然后比较a[1]和a[2],(a[1]=12)< (a[2]=43),不用交换位置,同理往后比较a[2]和a[3],(a[2]=43)>(a[3]=11),交换位置,此时的数组a为[3,12,11,43,56,90,7,66,82],以此类推,如果a[j]>a[j+1]就交换值,否则,继续往后。
注意:两个变量交换数据,一般情况下需要一个中介变量。比如:var a="a",b="b";让a和b交换值,需要一个中介变量:var temp=a;a=b;b=temp;这样
第一轮外层循环完之后,我们得到的数组a为[3,12,11,43,56,7,66,82,90],把值最大的90放在了数组的末尾。
第二次外层循环,我们只需要比较到a.length-2的位置即可,因为最后一项a[a.length-1]已经确定了(90)。第三次外层循环,我们需要比较到a.length-3的位置,所以内重循环j的值为j< a.length-1-i,通过两重循环,冒泡排序就完成了。
- function bubbleSort(arr){
- var n=arr.length; //获取数组的长度,即有n个数在排序
- var temp=null; //定义一个临时变量,交换数据用
- for(var i=0; i<n-1; i++){ //外层循环n-1次
- for(var j=0; j<n-1-i; j++){ //内层每次循环n-1-i次,每次循环完,都能从剩下的数当中找出一个最大的放在n-1-i的位置
- if(arr[j]>arr[j+1]){ //如果a[j]>a[j+1]则交换位置
- temp=arr[j];
- arr[j]=arr[j+1];
- arr[j+1]=temp;
- }
- }
- }
- return arr; //返回排好序的数组
- }
冒泡排序优化:
- function bubbleSort(arr){
- var n=arr.length;
- var temp=null;
- var flag=false;//设置标志位,初始值为false
- for(var i=0; i<n-1; i++){
- for(var j=0; j<n-1-i; j++){
- if(arr[j]>arr[j+1]){
- temp=arr[j];
- arr[j]=arr[j+1];
- arr[j+1]=temp;
- flag=true;//只要交换了标识就设为true
- }
- }
- if(flag){//只要交换了位置,flag的值就重新设置为false
- flag=false;
- }else{//如果没有交换,说明数组已经排好序,可以结束循环了
- break;
- }
- }
- return arr;
- }
快速排序的基本思想:首先从数组a中选取一个基准点(通常我们取中间项作为基准点),然后遍历数组,把小于基准点的项放到基准点左边集合,把大于基准点的项放到基准点右边集合。再对左边和右边两个集合重复前面的操作,直到每个子集就剩下一个元素。其实就是一个递归的思想。
依旧拿数组a=[12,3,43,11,56,90,7,66,82]举例,我们先选取一个基准点pivot=a[Math.floor(a.length/2)],即a[4]值为56,然后便利数组中的剩余项,把小于56的数组项放在左边的数组left中,把大于等于56的数组项放在右边的数组right中,第一轮操作结束后left=[12,3,43,11,7],right=[90,66,82],然后再对left和right重复以上的操作,直到left和right仅剩一项或为空时结束。最后返回left+pivot+right。
- function quickSort(arr){
- var len=arr.length;//获取arr的长度
- if(len<=1){//如果arr的长度小于等于1则直接返回arr
- return arr;
- }
- var pIndex=Math.floor(len/2);//获取基准点的索引下标
- var pivot=arr.splice(pIndex,1);//用splice方法获取基准点pivot=[arr[pIndex]],此时的arr为去除第pIndex项之后的剩余项;
- var left=[];
- var right=[];
- for(var i=0; i<arr.length; i++){
- if(arr[i]<pivot[0]){//如果小于基准点就放到数组l中
- left.push(arr[i]);
- }else{//如果大于等于基准点就放到右边数组中
- right.push(arr[i]);
- }
- }
- return quickSort(left).concat(pivot,quickSort(right));//递归不断重复整个过程
- }
插入排序的基本思想:首先选取数组的第一项即a[0],我们可以认为这个数是已经排好序的,再取a[1]项插入到已经排好序的元素中,此时只有a[0],所以我们需要比较a[1]和a[0]的大小。如果a[1]<a[0],则需要把a[1]先用一个临时变量temp保存,a[0]往后挪一位(即a[1]的位置),然后把temp赋值给a[0]。要插入的元素依次为a[1]-a[a.length-1]项,插入每一项时,都需要从后往前遍历已排好序的元素,如果已排好序的元素比要插入的元素大,则把该元素往后挪一位,直到已排好的元素小于等于要插入的元素(或者已经遍历完了已排好序的数组项),则把要插入的元素放入该位置+1的索引中(或者放在数组的第0个位置)。对每个插入项都执行上面的操作,则最后的数组就排好序了。
- function insertSort(arr){
- var temp=null;//定义一个临时变量保存要插入元素的值
- for(var i=1; i<arr.length; i++){//从索引位置1开始遍历数组
- if(arr[i]<arr[i-1]){//只有要插入的元素小于已排好序的最大元素的时候才需要进行下面的操作
- temp=arr[i];//把要插入的元素赋给一个临时变量
- var p=i-1;//已排好序的数组的最后一项索引为i-1
- while(temp<arr[p] && p>=0){//如果要插入的元素小于已排好序的元素并且没有到已排好数组的开始位置
- arr[p+1]=arr[p];//把大于要插入元素(temp)的已排好序元素位置往后挪一位
- p--;//从后往前便利已经排好序的元素
- }
- arr[p+1]=temp;//把要插入的元素插入到已排好序的数组中,索引位置为p+1
- }
- }
- return arr;//返回已排好序的数组
- }
JavaScript实现冒泡排序、快速排序、插入排序的更多相关文章
- javascript的冒泡排序, 快速排序, 选择排序, 插入排序
冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...
- JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 冒泡排序与插入排序(C#实现)
本人应届生面试,发现被问了2次关于排序的算法.当时竟然没写出来!!!好吧,可能是用库函数多了,很久没搞算法了,在纸上写没感觉吧. 今天花了1个多小时写了下冒泡排序与插入排序(C#实现),并写了注释和小 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- JS实现冒泡排序,插入排序和快速排序(从input中获取内容)
以前参加面试的时候,被问到过让用JS实现一个快速排序,当时太年轻,并没有回答上来. 于是,这里便把三种排序都用JS来做了一下.结合html,从input文本框中获取输入进行排序. 关于这几种算法的原理 ...
- 【C++】冒泡排序、插入排序、快速排序
#include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a ...
- 用js实现算法:冒泡排序、插入排序和快速排序
一.冒泡排序 function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j ...
随机推荐
- shell应用——主控脚本实现(1)
shell脚本作用:内网ip,公网ip :cpu负载,内存使用量:ngix和mysql...
- Metasploit辅助模块
msf > show auxiliary Auxiliary ========= Name Di ...
- 2013/7/16 HNU_训练赛4
CF328B Sheldon and Ice Pieces 题意:给定一个数字序列,问后面的数字元素能够组成最多的组数. 分析:把2和5,6和9看作是一个元素,然后求出一个最小的组数就可以了. #in ...
- Build Up Your Own Lightweight Workspace
写一段简单的批处理(.bat)放在自己建的workspace下. @set path=C:/Program Files/Java/jdk1.8.0_101/bin;%PATH%; //jdk的路径 @ ...
- 在 Windows XP 下查看所有卷标信息
http://support.hp.com/cn-zh/document/c01270024 点击“开始”,在“开始搜索”中输入:diskpart,然后按键盘“回车”键. 在“命令行窗口”中,等待“D ...
- hdu 2063 过山车(二分图最佳匹配)
经典的二分图最大匹配问题,因为匈牙利算法我还没有认真去看过,想先试试下网络流的做法,即对所有女生增加一个超级源,对所有男生增加一个超级汇,然后按照题意的匹配由女生向男生连一条边,跑一个最大流就是答案( ...
- GO语言中间的derfer
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行, 最后该函数返回.特别是当你在进行一些打开资 ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- SSH命令行上传/下载文件
上传:scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载:scp user(远端用户名)@host( ...
- Lua 栈中元素的位置
Lua与C.C#等的交互是通过栈来实现的,每次插入元素都是放在栈顶(top),至于元素的index,可以使用正数和负数两种方式, 如取栈底开始至第index个元素 -index = gettop - ...