冒泡排序(Bubble Sort)
function bubbleSort(arr) {
if (arr.length <= 1) {
return arr;
}
let flag;
let temp;
for (let i = 0; i < arr.length; i++) {
flag = true;
for (let j = 0; j < arr.length - 1 - i; j++) { // 内层循环
if (arr[j] > arr[j + 1]) { // 比较相邻两个值
flag = false;
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
if (flag) { // 如果flag为true,表示上轮循环已经有序
return arr;
}
}
}
快速排序(Quicksort)
function QuickSort(arr, low, high) {
let temp;
let i = low,
j = high;
if (low < high) {
temp = arr[low];
while (i < j) {
while (j > i && arr[j] >= temp) {
j--;
}
while (i < j && arr[i] <= temp) {
i++;
}
if (i < j) {
let t = arr[i];
arr[i] = arr[j]; //放在temp右边
arr[j] = t;
}
}
//最终将基准数归位
arr[low] = arr[i];
arr[i] = temp;
QuickSort(arr, low, i - 1);
QuickSort(arr, i + 1, high);
}
}
另一种写法
function QuickSort(arr, low, high) {
let temp;
let i = low, j = high;
if(low < high) {
temp = arr[low];
while(i < j) {
while(j > i && arr[j] >= temp) {
j--;
}
if(i<j) {
arr[i] = arr[j];
i++;
}
while(i < j && arr[i] < temp) {
i++;
}
if(i<j)
{
arr[j]=arr[i]; //放在temp右边
--j; //j左移一位
}
}
arr[i] = temp;
QuickSort(arr, low, i-1);
QuickSort(arr, i+1, high);
}
}
选择排序
function selectSort(arr) {
for (let i = 0; i < arr.length; i++) {
let min = arr[i];
let index = i;
for (let j = i + 1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];
index = j;
}
}
arr[index] = arr[i];
arr[i] = min;
}
}
插入排序
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let temp = arr[i];
let j = i - 1;
while (temp < arr[j] && j >= 0) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
堆排序
Array.prototype.heap_sort = function() {
var arr = this.slice(0);
function swap(i, j) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
function max_heapify(start, end) {
//建立父節點指標和子節點指標
var dad = start;
var son = dad * 2 + 1;
if (son >= end)//若子節點指標超過範圍直接跳出函數
return;
if (son + 1 < end && arr[son] < arr[son + 1])//先比較兩個子節點大小,選擇最大的
son++;
if (arr[dad] <= arr[son]) {//如果父節點小於子節點時,交換父子內容再繼續子節點和孫節點比較
swap(dad, son);
max_heapify(son, end);
}
}
var len = arr.length;
//初始化,i從最後一個父節點開始調整
for (var i = Math.floor(len / 2) - 1; i >= 0; i--)
max_heapify(i, len);
//先將第一個元素和已排好元素前一位做交換,再從新調整,直到排序完畢
for (var i = len - 1; i > 0; i--) {
swap(0, i);
max_heapify(0, i);
}
return arr;
};
var a = [3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6];
console.log(a.heap_sort());
归并排序
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, right);
}
function mergeSort(arr){
if(arr.length <=1) return arr;
var middle = Math.floor(arr.length / 2);
var left = arr.slice(0, middle);
var right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
console.log(mergeSort([1,2,4,51,22,1,53,5,2,5,3,111,3]));
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!