boutique-books/b00-阅读笔记/学习js数据结构与算法/sort&search.js
linghuam 46b0477778 a
2019-05-30 19:54:19 +08:00

130 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function swap(arr, index1, index2) {
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
function bubbleSort(arr) {
for (var i = 0, len = arr.length; i < len; i++) {
// 改进: j < len - 1 - i已经排好序的可以不用再比较
for(var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
}
var arr = [5,4,3,2,1];
// bubbleSort(arr);
function selectionSort(arr) {
var minIndex;
for (var i = 0; i < arr.length-1; i++) {
minIndex = i;
for (var j = i+1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
swap(arr, minIndex, i);
}
}
// selectionSort(arr);
function insertionSort(arr) {
if (arr.length < 2) return arr;
for (var i = 1, len = arr.length; i < len; i++) {
var j = i - 1;
var temp = arr[i]; // 相当于将i提取出留个空位
while(j >=0 && arr[j] > temp) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
insertionSort(arr);
function mergeSort(arr) {
var len = arr.length;
if (len === 1) return arr;
var mid = Math.floor(len/2);
var left = arr.slice(0, mid);
var right = arr.slice(mid, len);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var i = 0,
j = 0,
l = left.length,
r = right.length,
temp = [];
while(i < l && j < r) {
if (left[i] < right[j]) {
temp.push(left[i]);
i++;
} else {
temp.push(right[j]);
j++;
}
}
if (i < l) {
temp.push(...left.slice(i));
}
if (j < r) {
temp.push(...right.slice(j));
}
return temp;
}
function quickSort(arr, left, right) {
var index;
if (arr.length > 1) {
index = partition(arr, left, right);
if (left < index - 1) {
quickSort(arr, left, index-1);
}
if (right > index) {
quickSort(arr, index, right);
}
}
}
function partition(arr, left, right) {
var pivot = arr[Math.floor((left+right)/2)],
i = left,
j = right;
while(i <= j) {
while(arr[i] < pivot) {
i++;
}
while(arr[j] > pivot) {
j--;
}
if (i <= j) {
swap(arr, i, j);
i++;
j--;
}
}
return i;
}
function binarySearch(arr, value) {
var left = 0,
right = arr.length - 1;
var mid;
while(left <= right) {
mid = Math.floor((left+right)/2);
if (value < arr[mid]) {
right = mid - 1;
} else if(value > arr[mid]){
left = mid + 1;
} else {
return mid;
}
}
return -1;
}