Font-end(排序算法)
来源:互联网 发布:java 双亲委派模型 编辑:程序博客网 时间:2024/05/29 15:37
各种排序及其复杂度
插入排序(稳定)
function insertSort(arr){ var temp; for( var i = 1 ; i <= arr.length-1 ; i++){ //取出"分界线"右边第一位,作为temp(本轮循环就你了) temp = arr[i]; //设"分界线"左边第一位的下标,作为j j = i-1; while(j>=0 && arr[j] > temp){ arr[j+1] = arr[j];//二话不说,直接后挪一位 --j; } //挪后插 arr[j+1] = temp; } return arr;}
思想:
0、分“有序组”(左手已拿到并已排序的牌)、“无序组”(右手抽到的牌);
1、起初“分界线”在下标0和1之间;
2、取“分界线”右边第一位,作为temp(分界线后面的,在本轮先不管,因为表示还没抽到的牌啦);
3、设“分界线”左边第一位的下标,作为 j;
4、j = i-1,这样 j 就离 i 更近了;
5、当 j >= 0 ,并且 arr[ j ] > temp,可插,那就二话不说,直接将那大块只挪到后一位。被大块只覆盖掉的朋友你别怕,你肯定是已经被抽取出来的啦;
6、然后再while循环,如果没有再出现比你这个temp大的还好;若有,这“第二大块只”也直接覆盖掉刚刚“大块只”的地方。不用担心,大块只已早就分身有术了;这时候 j 已跑在前沿了~
7、好啦,如果再没有出现过,那就是不用循环了;将arr[ j+1 ] = temp;temp要的位置就是你啦!
8、然后将分界线向右走一个单位,重复2~7,假装又取了一张牌;
快速排序(不稳定!)
function quickSort(arr){ //如果数组<=1,则直接返回 if(arr.length<=1){return arr;} var pivotIndex=Math.floor(arr.length/2); //找基准,并把基准从原数组删除 var pivot=arr.splice(pivotIndex,1)[0]; //定义左右数组 var left=[]; var right=[]; //比基准小的放在left,比基准大的放在right for(var i=0;i<arr.length;i++){ if(arr[i]<=pivot){ left.push(arr[i]); } else{ right.push(arr[i]); } } //递归 return quickSort(left).concat([pivot],quickSort(right)); }
选择排序(不稳定!)
function selectSort(arr){ var min,temp; for(var i = 0 ; i < arr.length-1 ; i++){ min = arr[i]; for(var j = i+1; j < arr.length ; j++){ if(arr[j] < min){ temp = min; min = arr[j]; arr[j] = temp; } } arr[i] = min; } return arr;}
思想:
0、一共会进行 arr.length - 1轮的比赛;
1、从左边第一个数(即 i=0)开始,拷贝他,作为“天选之子”放到min;
2、将它后面一直觊觎着这个皇位的人,一个个和这个min比较。谁赢了,谁也拷贝一份做min,然后将min扔到走掉的那个人的位置,一直到最后一个觊觎的小人;
3、就在本次循环后,min里的数,放到当前的i处;
4、本轮比赛结束,i++
冒泡排序(稳定)
var arr = [2,88,6,8,3,0,34,72]; var sort = {}; sort.bubbleSort = function (arr) { if (arr.length <= 1) { return arr; } //i表示比较的轮数 for (var i = 0; i < arr.length - 1; i++) { //比较i轮,把i个最大数放在数组后面,排数这i个数 for (var j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } console.log("第" + i + "轮:arr=[" + arr + "]"); } }; sort.bubbleSort(arr); console.log(arr); 第0轮:arr=[2,6,8,3,0,34,72,88] 第1轮:arr=[2,6,3,0,8,34,72,88] 第2轮:arr=[2,3,0,6,8,34,72,88] 第3轮:arr=[2,0,3,6,8,34,72,88] 第4轮:arr=[0,2,3,6,8,34,72,88] 第5轮:arr=[0,2,3,6,8,34,72,88] 第6轮:arr=[0,2,3,6,8,34,72,88] [0, 2, 3, 6, 8, 34, 72, 88]
希尔排序(不稳定!)
function shallSort(array) { var increment = array.length; var i var temp; //暂存 var count = 0; do { //设置增量 increment = Math.floor(increment / 3) + 1; for (i = increment ; i < array.length; i++) { console.log(increment); if (array[i] < array[i - increment]) { temp = array[i]; for (var j = i - increment; j >= 0 && temp < array[j]; j -= increment) { array[j + increment] = array[j]; } array[j + increment] = temp; } } } while (increment > 1) return array;}
归并排序(稳定)
归并排序:其基本思想是分治策略,先进行划分,然后再进行合并。
假设要对数组C进行归并排序,步骤是:
1.先将C划分为两个数组A和B(即把数组C从中间分开)
2.再分别对数组A、B重复步骤1的操作,逐步划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。
function merge(left, right) { var result = []; while(left.length > 0 && right.length > 0) { if(left[0] < right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } /* 当左右数组长度不等.将比较完后剩下的数组项链接起来即可 */ return result.concat(left).concat(right); } function mergeSort(arr){ if(arr.length==1) {return arr}; var mid=Math.floor(arr.length/2); var left_arr=arr.slice(0,mid),right_arr=arr.slice(mid); return merge(mergeSort(left_arr),mergeSort(right_arr)); } var arr=[12,20,30,21,15,33,26,19,40,25]; console.log(mergeSort(arr));
堆排序(不稳定)
基数排序(稳定)
- Font-end(排序算法)
- Font-End(理论知识)
- Font-end(CSS章)
- Font-end(编程题)
- Font-end(面试准备)
- Font-end(项目时会用到)
- 【Font-End】CSS教程
- CSS Mastery2(10.5.4-end)@font-face&cufon&&Ajax&jQuery增强交互性&黑画(5-another road)
- 从机器学习算法的发展 理解 端到端(end to end)学习
- Font能否new一个Font对象()
- Font.Style(Delphi)
- css中font的简写方法(包括font-weight,font-size,line-height,font-family)
- font
- font
- Font
- font
- font
- font
- Python扁平化写法(不断更新)
- Kotlin 流程控制
- 程序员常用网站收藏[定期更新]——csdn博客
- Linux链接命令和搜索命令
- BZOJ 1143 [CTSC2008] 祭祀river
- Font-end(排序算法)
- Yii2 rules验证规则
- 浅谈c语言中的位段
- 白天求生存,晚上谋发展
- oracal关于job也就是定时任务
- JDBC
- 【a标签的锚点技术】
- oracal开发工作记录
- 航信概要设计-1-2