测试数组
let arr = [49, 38, 65, 97, 76, 13, 27, 49];
1.冒泡排序
每一轮排序,都比较元素相邻的值,若大小顺序不对,则交换元素的位置。保证每一轮将当前剩余元素的最大值放到最后。
function BubbleSort(arr) {
var len = arr.length;
var temp;
for (var i = len - 1; i >= 0; i--) {
for (var j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
console.log(arr);
}
}
BubbleSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 76, 13, 27, 49, 97 ]
Array(8) [ 38, 49, 65, 13, 27, 49, 76, 97 ]
Array(8) [ 38, 49, 13, 27, 49, 65, 76, 97 ]
Array(8) [ 38, 13, 27, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
2.选择排序
每一轮排序,找到当前剩余元素的最小值(最大值),并记录它的下标。每一轮查找之后,将当前最小值(最大值)与当前剩余元素的首元素或尾元素交换位置。
function SelectSort(arr){
var len = arr.length;
var min,temp;
for(var i=0;i<len;i++){
min=i;
for(var j=i+1;j<len;j++){
if(arr[j]<arr[min]) min = j;
}
if(min!=i){
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
console.log(arr);
}
}
SelectSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 13, 38, 65, 97, 76, 49, 27, 49 ]
Array(8) [ 13, 27, 65, 97, 76, 49, 38, 49 ]
Array(8) [ 13, 27, 38, 97, 76, 49, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 97, 65, 76 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 97, 76 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
3.插入排序
从第一项开始,记录此时的值。然后依次比较它前面的元素,若比它大,则前面的元素向后移动一位,直到找到比它小的元素,并将自己插入到这个元素的后面一位。
function InsertSort(arr) {
var len = arr.length;
var temp;
for (var i = 1; i < len; i++) {
temp = arr[i];
var j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
console.log(arr);
}
}
InsertSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 76, 97, 13, 27, 49 ]
Array(8) [ 13, 38, 49, 65, 76, 97, 27, 49 ]
Array(8) [ 13, 27, 38, 49, 65, 76, 97, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
4.希尔排序
将数组按照一定间隔分组,分组里面使用插入排序,每次排序之后减小分组的大小,再次在每个分组里面排序,直到最后分组为1。
function ShellSort(arr) {
var len = arr.length;
var gap = len >> 1;
while (gap >= 1) {
for (var i = 0; i < gap; i++) {
for (var j = gap + i; j < len; j += gap) {
var k = j - gap;
var temp = arr[j];
while (k >= 0 && arr[k] > arr[j]) {
arr[k + gap] = arr[k];
k -= gap;
}
if (j != k + gap) {
arr[k + gap] = temp;
}
}
}
gap = gap >> 1;
console.log(arr);
}
}
ShellSort(arr);
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 49, 13, 27, 49, 76, 38, 65, 97 ]
Array(8) [ 27, 13, 49, 38, 65, 49, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
5.快速排序
快速排序图解
function QuickSort(arr) {
var len = arr.length;
function sort(arr, left, right) {
var start = left,
end = right;
var base = arr[start];
while (start < end) {
while (end > start && arr[end] >= base) {
end--;
}
if (end == start) break;
arr[start] = arr[end];
while (end > start && arr[start] <= base) {
start++;
}
if (end == start) break;
arr[end] = arr[start];
}
arr[start] = base;
console.log(arr);
if(start-1>left) sort(arr,left,start-1);
if(end+1<right) sort(arr,end+1,right);
}
sort(arr, 0, len - 1);
}
QuickSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 27, 38, 13, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
6.归并排序
将数组不断拆分为两个数组,直到最后数组中只有两个元素,再把数据按顺序两两归并到一起。
function MergeSort(arr) {
function merge(arr) {
var len = arr.length;
if (len < 2) return arr;
else{
var mid = len >> 1;
var left = arr.slice(0, mid);
var right = arr.slice(mid);
return sort(merge(left), merge(right));
}
}
function sort(left, right) {
var result = [];
if (left.length && right.length) {
if (left[0] < right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
console.log(result);
return result;
}
merge(arr);
}
MergeSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array [ 38, 49 ]
Array [ 65, 97 ]
Array(4) [ 38, 49, 65, 97 ]
Array [ 13, 76 ]
Array [ 27, 49 ]
Array(4) [ 13, 76, 27, 49 ]
Array(8) [ 13, 38, 49, 65, 97, 76, 27, 49 ]
7.堆排序
堆排序图解
function HeapSort(arr) {
var len = arr.length;
for (var i = len; i > 0; i--) {
heap(arr, i);
var temp = arr[0];
arr[0] = arr[i - 1];
arr[i - 1] = temp;
console.log(arr);
}
function heap(arr, len) {
for (var i = len >> 1; i >= 0; i--) {
sort(arr, i);
}
function sort(arr, x) {
var left = x * 2 + 1;
var right = x * 2 + 2;
var max = x;
if (left < len && arr[left] > arr[max]) {
max = left;
}
if (right < len && arr[right] > arr[max]) {
max = right;
}
var temp = arr[max];
arr[max] = arr[x];
arr[x] = temp;
if (max != x)
sort(arr, max);
}
}
}
HeapSort(arr);
输出
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 76, 65, 49, 49, 13, 27, 97 ]
Array(8) [ 27, 49, 65, 38, 49, 13, 76, 97 ]
Array(8) [ 13, 49, 27, 38, 49, 65, 76, 97 ]
Array(8) [ 13, 49, 27, 38, 49, 65, 76, 97 ]
Array(8) [ 13, 38, 27, 49, 49, 65, 76, 97 ]
Array(8) [ 27, 13, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]