冒泡、快速、插入三种排序对应的原理

一.冒泡排序

说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面;

如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下

第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10]

第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10]

以此类推 。。。。

结果 [1, 2, 3, 3, 4, 4, 4, 7, 8, 10];

 
  1. //冒泡排序
  2. function bubbleSort(arr){
  3. var len = arr.length,t
  4. for(j=0;j<=len-1;j++){
  5. for(i=0;i<=len-j-1;i++){
  6. if(arr[i]>arr[i+1]){
  7. t = arr[i+1];
  8. arr[i+1] = arr[i];
  9. arr[i] = t;
  10. }
  11. }
  12. }
  13. return arr;
  14. }

二.快速排序

快速排序也是我们常用到的一种排序方式,核心步骤如下

1.选择中间数。

2.构建两个临时数组,比中间数小的放到左边,大的放到右边

3.对临时数组重复1-2;

例如,我们原始数组为[2,4,1,5,6,3,12,9,7],第一步我们选择第5项 6 为中间数,创建临时数组left,right,则left 结果为[2,4,1,5,3],right 结果为 [12,9,7]。然后再分别对left和right进行相同的操作,直至left及right数组长度为1.

具体代码如下:

 
  1. //快速排序
  2. function quickSort(arr){
  3. if(arr.length <= 1){ //数组长度为1时,则停止递归
  4. return arr
  5. }
  6. var l = Math.floor(arr.length/2); //选择中间数
  7. var left = [],right=[];
  8. var splitEle = arr.splice(l,1)[0] //将中间数从原数组删除并保存
  9. for(i=0;i<arr.length;i++){
  10. if(arr[i] < splitEle){
  11. left.push(arr[i])
  12. }else{
  13. right.push(arr[i])
  14. }
  15. }
  16. return arguments.callee(left).concat(splitEle,arguments.callee(right))
  17. }

三.选择排序

选择排序核心思想如下:

加入我们进行升序排列,我们假设数组第一项为最小值,然后将第一项与其他项分别比较,如果其他项小于第一项,则交换位置,这样第一次循环结束我们可以保证第一项为最小值。然后第二项做类似操作,然后以此类推,具体如下图所示

代码如下:

 
  1. //选择排序
  2. function selectQuot(arr){
  3. for(i=0; i<arr.length-1; i++){
  4. for(j=i+1;j<arr.length;j++){
  5. if(arr[i] > arr[j]){
  6. var temp;
  7. temp = arr[i];
  8. arr[i] = arr[j];
  9. arr[j] = temp;
  10. }
  11. }
  12. }
  13. return arr
  14. }

四.插入排序

插入排序很好理解,首先我们取出第一项放入一个虚构的数组,然后取第二项,假如第二项小于第一项,则将第二项放于第一项的前面,否则放在后面;然后取第三项,分别与前两项进行比较(是不是有点儿类似打扑克牌~~)

如我们的数组为[2, 4, 1, 5, 3, 8 ,7 ,9 , 6];

假定我们有一个虚拟数组,则第一步数组为[2],然后我们取数组的第二项,发现要比刚才取得数组项大,则我们放在后面即虚拟数组变成[2,4],然后取下一项与虚拟数组中的项分别比较,按上述思路结果为[1,2,4],以此类推……当然在实际编程中我们并不需要单独创建数组。

代码如下:

 
  1. //插入排序
  2. function insertSort(arr){
  3. for(i=1 ; i<arr.length ; i++ ){
  4. var temp = arr[i],
  5. j = i - 1;
  6. while(j>=0 && temp < arr[j]){
  7. arr[j+1] = arr[j]; //相当于将虚拟数组当前项后移一位,同时虚拟数组长度+1
  8. j--;
  9. }
  10. arr[j+1] = temp; //新加项最终插入的位置
  11. }
  12. return arr;
  13. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值