8大排序算法总结 JS 实现

//bubble sort

function bubbleSort(arr,comp){

for(var i = 0;i < arr.length; i++){
for(var j = 0; j < arr.length - i - 1; j++){
if(comp(arr[j],arr[j+1])){
exch(arr,j,j+1);
}
}
}

}

function exch(a,i,j){
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}

var input = new Array(5,1,4,2,3);
bubbleSort(input,function(a,b){return a > b;});
console.log(input);

input = new Array(5,1,4,2,3);
bubbleSort(input,function(a,b){return a < b;});
console.log(input);

//selection sort

function selectionSort(arr,comp){

for(var i = 0;i < arr.length ; i++){
for(var j = i;j < arr.length ; j++){
if(comp(arr[i],arr[j])) { exch(arr,i,j); }
}
}

}

function exch(a,i,j){
var t = a[i];
a[i] = a[j];
a[j] = t;
}

var input = new Array(5,1,4,2,3);
selectionSort(input,function(a,b){return a > b;});
console.log(input);

input = new Array(5,1,4,2,3);
bubbleSort(input,function(a,b){return a < b;});
console.log(input);

//insert sort

function insertSort(arr,comp){
var result = new Array();
for(;arr.length > 0;){

var inserted = false;
for(var j = 0;j < result.length; j++){
if(comp(result[j],arr[0])) { insert(result,j,arr[0]); inserted = true; break;}
}
if(!inserted){insert(result,result.length,arr[0]);}
arr.splice(0,1);
}
return result;
}

function insert(arr,i,v){
arr.splice(i,0,v);
}

var input = new Array(5,1,4,2,3);
var ret = insertSort(input,function(a,b){return a > b;});
console.log(ret);

var input = new Array(5,1,4,2,3);
ret = insertSort(input,function(a,b){return a < b;});
console.log(ret);

//shell sort

function shellSort (a,comp) {
    for (var h = a.length; h = parseInt(h / 2);) {
        for (var i = h; i < a.length; i++) {
            var k = a[i];
            for (var j = i; j >= h && comp(k, a[j - h]); j -= h)
                a[j] = a[j - h];
            a[j] = k;
        }
    }
    return a;
}

var arr =new Array(7,9,2,5,4,1,3);
var r = shellSort(arr,function (a,b){return a > b;});
console.log(r);

//merge sort

function mergeS(arr,comp){

if(arr.length == 1){return arr;}

var mid = arr.length / 2 | 0;
var leftArr = new Array();
var rightArr = new Array();
for(var i = 0;i < mid;i ++){
leftArr.push(arr[i]);
}

for(var j = mid;j < arr.length; j++){
rightArr.push(arr[j]);
}

console.log("before : " + leftArr + " | " + rightArr);
var leftRet = mergeS(leftArr,comp);
var rightRet = mergeS(rightArr,comp);

var r = merge(leftRet,rightRet,comp);
return r;
}

function merge(leftArr,rightArr,comp){

var ret = new Array();
var i = j = 0;
for(;i < leftArr.length && j < rightArr.length; ){
if(comp(leftArr[i],rightArr[j])){ret.push(leftArr[i]); i ++}
else {ret.push(rightArr[j]); j ++}
}

for(;i < leftArr.length;){
ret.push(leftArr[i]);i++;
}
for(;j< rightArr.length; ){
ret.push(rightArr[j]);j++;
}

return ret;

}

var r = mergeS(new Array(0,6,5,1,2,4,3,9),function(a,b){return a > b;});
console.log(r);

//quick sort

function quickS(arr,lo,hi,comp){
if(lo >= hi){return ;}

var stub = arr[lo];

var i = lo + 1;
var j = hi;

for(;i < j ;){
for(;i < j && !comp(stub,arr[j]);j--);
for(;i < j && comp(stub,arr[i]);i++);

if(i >= j){break;}

var t = arr[i];
arr[i] = arr[j];
arr[j] = t;

j--;
i++;
}

if(comp(arr[lo],arr[i])){
var t = arr[lo];
arr[lo] = arr[i];
arr[i] = t;
}

quickS(arr,lo,i-1,comp);
quickS(arr,i,hi,comp);
}

var input = new Array(22,3,10,66,15,11,2,4,31,9);
quickS(input, 0, input.length - 1,function(a,b){return a > b;});
console.log(input);

//heap sort

var ret = new Array();
function heapS(arr,comp){
if(arr.length == 0){return ;}
var i = arr.length / 2 | 0 ;
for(;i >= 0; i--){
if(comp(arr[i], arr[i * 2])){exch(arr, i, i*2);}
if(comp(arr[i], arr[i * 2 + 1])) {exch(arr, i, i*2 + 1);}
}
ret.push(arr[0]);
arr.splice(0,1);
heapS(arr,comp);
}

function exch(arr,i,j){
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}

heapS(new Array(16,22,91,0,51,44,23),function (a,b){return a > b;});
console.log(ret);
时间: 2024-10-19 09:47:53

8大排序算法总结 JS 实现的相关文章

九大排序算法总结

九大排序算法再总结 算法的由来:9世纪波斯数学家提出的:“al-Khowarizmi” 排序的定义: 输入:n个数:a1,a2,a3,...,an 输出:n个数的排列:a1',a2',a3',...,an',使得a1'<=a2'<=a3'<=...<=an'. In-place sort(不占用额外内存或占用常数的内存):插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 当需要对大量数据进行排序时,In-plac

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

6大排序算法,c#实现

1 using System; 2 using System.Text; 3 using System.Collections.Generic; 4 5 namespace ArithmeticPractice 6 { 7 static class ExtendsFunction 8 { 9 public static string printArray(this Array p_arr) 10 { 11 StringBuilder sb = new StringBuilder("[ "

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序

  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下.遂觉:这是欠下的账,现在该还了.   排序按照空间分类: In-place sort不占用额外内存或占用常数的内存 插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 或者按照稳定性分类: stable sort:插入排序.冒泡排序.归并排序.计数排序.基数排序.桶排序. unstable sort

常见排序算法(JS版)

常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>twobin 常见排序算法 (JS版) </title> 5 <meta http-equiv="content-type" content=&

九大排序算法,你会几个?

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已

Java 8大排序算法

直接插入排序 //直接插入排序 public int[] insertSort(int[] a) { for (int i = 1; i < a.length; i++) { int j = i - 1; for (; j >= 0 && a[j] > a[i]; j--) { a[j + 1] = a[j];//往后移 } a[j + 1] = a[i]; } return a; } 希尔排序 //希尔排序 public int[] shellSort(int[] a)

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前