排序算法研究
来源:互联网 发布:itunes发生网络错误 编辑:程序博客网 时间:2024/06/06 09:14
在学习JavaScript的数组时,我们知道排序有一个sort()方法,但是sort方法对数组成员进行排序时,默认的是按照字典顺序排序,即按照acsii码表来排序。但是这并不能满足我们对一组无需数字进行排序的要求,所以对排序算法进行了学习,并用代码实现。
冒泡排序(Bubble Sort):
它的基本思想是:
1、依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位;
2、再对最后一位以外的数组,重复前面的过程,直至全部排序完成;
1、依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位;
2、再对最后一位以外的数组,重复前面的过程,直至全部排序完成;
代码实现(从小到大排序):
<span style="font-size:18px;"> <function bubbleSort(arr){ for(var i=1;i<arr.length;i++){ for(var j=0;j<arr.length-i;j++){ if(arr[j]>arr[j+1]){//比较相邻两数的大小,若前者大于后者,则交换位置,使最大的数排到最后 var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; }</span>
快速排序:
“快速排序”的思想很简单,整个排序过程只需要三步:
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
举例来说,现在有一个数据集{88, 22, 63, 45, 13, 37, 95, 50},怎么对其排序呢?
第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解)
第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解)
88, 22, 63, 45, 13, 37, 95, 50
第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45"另一个"大于等于45"
22,13,37,45, 88,63,95,50
第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止
22,13,37, 45,88,63,95,50
13,22,37, 45, 50,63,88,95
13,22,37, 45, 50,63,88,95
13,22,37,45,50,63,88,95
代码实现:
<span style="font-size:18px;">function quickSort(arr){ if(arr.length<=1){return arr;}//检查数组个数,如果小于等于1,直接返回 var baseIndex=Math.floor(arr.length/2);//选择数组中间值作为“基准” var baseValue=arr.splice(baseIndex,1)[0];//选择“基准”,并将其与原数组分离 var left=[];//定义两个空数组,用来存放两个子集 var right=[]; for(var i=0;i<arr.length;i++){//遍历数组,小于“基准”的放左边,大于“基准”的放右边 if(arr[i]>baseValue){ right.push(arr[i]); }else{ left.push(arr[i]); } } return quickSort(left).concat(baseValue,quickSort(right));//递归方法重复这个过程,知道排序完成 }</span>
直接插入排序:
基本思想:
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
代码实现:
<span style="font-size:18px;"> function insertSort(arr){ for(var i=1;i<arr.length;i++){ var temp=arr[i]; for(var j=i-1;j>=0&&temp<arr[j];j--){ arr[j+1]=arr[j]; } arr[j+1]=temp; } return arr; }</span>
水平有限,以上算法可能解释的不是很清楚,欢迎大家评论,互相交流哦!
0 0
- 排序算法研究
- 插入排序算法研究
- 归并排序算法研究
- 排序算法的研究
- 排序算法研究
- 排序算法动手研究
- 冒泡排序算法研究
- C++常用排序算法研究
- 算法研究之插入排序
- 搜索引擎网页排序算法研究
- 算法研究之快速排序
- 算法研究之快速排序
- 排序算法的稳定性研究
- 算法研究之快速排序
- 插入排序之算法研究
- 排序算法的稳定性研究
- 经典排序算法效率研究
- C++常用排序算法研究
- Double precision
- 科大讯飞语音合成android studio 21001错误
- 151. Reverse Words in a String 翻转字符串中的单词
- upnp 端口映射
- ThinkPHP怪现象:数据表新增字段后开发模式可更新运行模式无法更新
- 排序算法研究
- IOS 在iPhone上实现简单Http服务
- 设计模式之装饰器
- C#控制台 输出hello world之 用派生类的方法屏蔽基类的方法输出
- 树莓派做web服务器
- Java 设计模式之建造者模式的详解(创建模式)
- FANUC系统-斗笠式加工中心 加工程序解析
- java面向对象3
- C#控制台 输出hello world之 使用基类的引用输出