两路快排:
function partion(arr, low, high){
var idx = low;
var pivot = arr[low];
while(low<high){
while(low<high && arr[high]>= pivot){ high--; }
while(low<high && arr[low] <= pivot) { low++; }
if(low<high){
var temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
}
}
if(low == high){
arr[idx] = arr[low];
arr[low] = pivot;
}
return low;
}
function quicksort1(arr, low, high){
if(low < high ){
var pivot = partion(arr, low, high);
quicksort(arr, low, pivot-1);
quicksort(arr, pivot+1, high);
}
}
function quicksort2(arr, low, high){
var stack = [];
if(low<high){
var mid = partion(arr, low, high);
if(low< mid -1){
stack.push(low);
stack.push(mid-1);
}
if(mid+1< high){
stack.push(mid+1);
stack.push(high);
}
}
while(stack.length > 0){
var higher = stack.pop();
var lower = stack.pop();
var midder = partion(arr, lower, higher);
if(lower < midder -1){
stack.push(lower);
stack.push(midder -1);
}
if(midder+1 < higher){
stack.push(midder + 1);
stack.push(higher);
}
}
}
var arr = [3,6,2,9,4,7];
quicksort1(arr, 0, arr.length -1);
quicksort2(arr, 0, arr.length -1);
function Bubblesort(arr){
var len = arr.length;
for(var i=0;i< len-1; i++){ //代表要排序多少次
for(var j=0;j< len-i-1;j++){ //每次的起始和截止位置
if(arr[j] > arr[j+1]){
var tem = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tem;
}
}
}
}
选择排序:
function Selection(arr){
for(var i=0;i< arr.length-1; i++){ //代表要排序多少次
for(var j=i+1; j<arr.length; j++){ //起始和截止位置
if(arr[i] > arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
插入排序:一般的插入排序
对于每个未排序数,在已排序序列中从后向前扫描找到相应位置并插入。默认arr[0]为开始。
function InsertSort(arr){
for(var i=1;i< arr.length;i++){ //需要对arr.length-1个数进行排序,级进行这么多次
var item = arr[i]; //记录待排序数数值和下标
var pos = i;
while(i>0 && item< arr[i-1]){ //找应该插在哪个位置
i--;
}
//位置已确定,即从i位置往后移动
for(var k=pos; k>i; k--){
arr[k] = arr[k-1];
}
arr[k] = item;
}
}
存在缺陷:我在查找应该插入哪个位置的时候只是单纯的去找位置,找到后才移动,可以更为优化,即在查找的时候若不是就移动一个
function InsertSort(arr){
for(var i=1;i< arr.length;i++){
var item = arr[i];
var pos = i;
while(i>0 && item< arr[i-1]){
arr[i] = arr[i-1];
i--;
}
arr[i] = item;
}
}
希尔排序:分组插入排序(高级插入排序)
第一次排序:将数组按增量划分为多个列,装在一个表中,对列分别进行插入排序,之后再合并为一个数组
第二次排序:将数组按另一个增量划分多个列,同上
function shellSort(arr){
var gap = Math.floor(arr.length/2);
while(gap>0){
for(var i=gap; i<arr.length; i++){
var temp = arr[i];
while(i>=gap && temp < arr[i-gap]){
arr[i] = arr[i-gap];
i -= gap;
}
arr[i] = temp;
}
gap = Math.floor(gap/2);
console.log(gap)
}
}
归并排序:
有点问题:
function dev(arr){
if(arr.length <=1) return arr;
var mid = Math.floor(arr.length/2);
var leftarr = dev(arr.slice(0, mid));
var rightarr = dev(arr.slice(mid));
return merge(leftarr, rightarr);
}
function merge(leftarr, rightarr){
var l,r = 0;
var result = [];
while(l<leftarr.length && r< rightarr.length){
if(leftarr[l] < rightarr[r]){
result.push(leftarr[l]);
l++
}else{
result.push(rightarr[r]);
r++;
}
}
for(var i=l; i< leftarr.length; i++){
result.push(leftarr[i]);
}
for(var i=r; i< rightarr.length; i++){
result.push(rightarr[i]);
}
return result;
}
二分排序:
function binarySearch(value,arr,startIndex,endIndex) {
if(!value|| !(arr instanceof Array)) return;
var midIndex= Math.floor((startIndex + endIndex)/2),
midval = arr[midIndex];
if(midval === value){
return midIndex;
}else if (midval > value) {
return binarySearch(value, arr, startIndex, midIndex - 1);
}else {
return binarySearch(value, arr, midIndex + 1, endIndex);
}
}
转载自:http://www.cnblogs.com/venoral/p/5836106.html