标签:style blog http color os io java strong ar
1、冒泡排序:从尾致头做一遍相邻元素的两两比较,将小的元素往前交换位置,一遍下来得到第一个元素为最小的,然后在剩余的n-1个元素中再进行比较,选出第二个最小的,以此类推。
不稳定、O(n²)
function bubbleSort(arr){ var i,j,tmp,len=arr.length; for(i=0;i<len;i++){ for(j=len-1;j>i;j--){ if(arr[j]<arr[j-1]){ tmp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tmp; } } } return arr; }
2、快速排序:选取一个基准,将大于它的元素放在右边,小于它的放在左边,然后分别对左右子列进行快排。
不稳定、O(nlog2n)
方法1:该算法比较通俗易懂,但可能有性能上的问题,每次递归都创建两个新的数组,而且有人说快排应该是原地排序,该算法却返回了一个新数组。大家可以自己研究研究。 转自阮一峰的网络日志 :http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html
function quickSort(arr){ if(arr.length<=1) return arr; var left = []; var right = []; var pos = arr.splice(Math.floor(arr.length/2),1); for(i=0;i<arr.length;i++){ if(arr[i]<pos){ left.push(arr[i]); }else{ right.push(arr[i]); } } return quickSort(left).concat(pos,quickSort(right)); }
方法2:这是我自己的写的算法,每次递归取第一个元素为基准pivot,然后从最后j往前比较,直到arr[j]<pivot,将arr[j]的值赋给arr[i],然后从i++的位置往后比较,直到arr[i]>pivot,将arr[i]的值赋给arr[j],然后再从j--的位置往前,以此类推,直到i=j,将pivot赋给arr[i]。
function quickSort(arr,left,right){ if(left<right){ var pos = partition(arr,left,right); quickSort(arr,left,pos-1); quickSort(arr,pos+1,right); } function partition(arr,low,high){ var i = low; j = high; var pivot = arr[i]; while(i!=j){ while(arr[j]>pivot && i<j){j--;} if(i<j){ arr[i] = arr[j]; i++; } while(arr[i]<pivot && i<j){i++;} if(i<j){ arr[j] = arr[i]; j--; } } arr[i] = pivot; return i; } return arr; } quickSort(arr,0,arr.length-1);
3、直接插入排序:把第一个元素当做一个有序子列,然后将后面的元素一个一个比较交换,然后插入。
稳定、O(n²)
function insertSort(arr){ var tmp; for(var j=1;j<arr.length;j++){ tmp = arr[j]; var i = j-1; while(i>=0 && arr[i]>tmp){ arr[i+1] = arr[i]; i--; } arr[i+1] = tmp; } return arr; }
4、选择排序:先选取数组中最小的元素,与第一个元素交换位置,然后再在其余n-1个元素中选取最小的元素,与第二个元素交换位置,以此类推。
不稳定、O(n²)
function selectionSort(arr){ var tmp; for(var i=0;i<arr.length-1;i++){ var k = i; for(var j=i+1;j<arr.length;j++){ if(arr[j]<arr[k]){ k=j; } } if(k!=i){ tmp = arr[i]; arr[i] = arr[k]; arr[k] = tmp; } } return arr; }
5、希尔排序:是插入排序的一种,又称缩小增量排序。先取一个小于n的整数gap作为第一个增量(一般是数组长度的一半),把文件的全部记录分组。所有距离为gap的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后gap/2,重复上述的分组和排序,直至所取的增量gap=1,即所有记录放在同一组中进行直接插入排序为止。
不稳定、O(nlog2n)
function shellSort(arr){ var gap = arr.length/2; while(gap){ shell(arr,gap); gap = Math.floor(gap/2); } function shell(arr,gap){ for(var i=gap;i<arr.length;i++){ var j = i, tmp = arr[i]; while(j>=gap && tmp<arr[j-gap]){ arr[j] = arr[j-gap]; j-=gap; } arr[j] = tmp; } } return arr; }
6、二分法插入排序:是对直接插入的一种改进,插入的时候不是从后往前一个个比较,而是采用二分法的方式查找。
稳定、O(nlog2n)
function binarySort(arr){ for(var i=1;i<arr.length;i++){ bs(arr,i); alert(arr); } function bs(arr,i){ var left = 0, right = i-1; var tmp = arr[i]; while(left<=right){ var middle = Math.floor((left+right)/2); if(arr[middle]<tmp){ left = middle+1; }else{ right = middle-1; } } for(var k=i-1;k>=left;k--){ arr[k+1] = arr[k]; } arr[left] = tmp; } return arr; }
标签:style blog http color os io java strong ar
原文地址:http://www.cnblogs.com/cr-smile/p/3947116.html