这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下。

<!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>JS实现排序</title>
<meta name="description" content="用JS自己写的排序算法">
<meta name="keywords" content="JS,排序">
</head> <body>
<script type="text/javascript">
//从小到大排序
var a = [, , , , , , , , ];
//第一种:简单冒泡排序
function bubbleSort0(ar) {
for (var i = ; i < ar.length - ; i++) { //a.length长的数组只要进行a.length-1次排序,0-a.length-2刚好为a.length-1的长度
for (var j = i + ; j < ar.length; j++) {
if (a[i] > a[j]) {
a[i] ^= a[j]; //交换两个数
a[j] ^= a[i];
a[i] ^= a[j];
}
}
}
}
bubbleSort0(a);
console.log("简单冒泡排序:" + a); //第二种:正宗冒泡排序
var a = [, , , , , , , , ];
function bubbleSort(ar) {
var flag = true;
for (var i = ; i < ar.length - && flag; i++) { //a.length长的数组只要进行a.length-1次排序,0-a.length-2刚好为a.length-1的长度
for (var j = ar.length - ; j > i; j--) { //判断条件与下面的判断条件的边界值需要注意
flag = false; //默认标志为false,则当不进入下面括号的时候代表i之后的数已经排好了序,这里用的是上一轮排序的结果
if (a[j] < a[j - ]) {
a[j] ^= a[j - ];
a[j - ] ^= a[j];
a[j] ^= a[j - ];
flag = true; //当i后面有数据交换的时候则认为排序没有完成
}
}
}
}
bubbleSort(a);
console.log("正宗冒泡排序:" + a); //第三种:简单选择排序
var a = [, , , , , , , , ]; function selectSort(ar) {
for (var i = ; i < ar.length - ; i++) {
var temp = i;
for (var j = i + ; j < ar.length; j++) {
if (a[j] < a[temp])
temp = j;
}
if (temp != i) {
a[i] ^= a[temp];
a[temp] ^= a[i];
a[i] ^= a[temp];
}
}
}
selectSort(a);
console.log("简单选择排序:" + a); //第四种:插入排序
var a = [, , , , , , , , , ]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
function insertSort(ar) {
for (var i = ; i < ar.length; i++) { //假设a[1]为已经排好序的数列,虽然只有一个数
if (a[i] < a[i - ]) { //当后面的数比前面的数小的时候
a[] = a[i];
for (var j = i - ; a[j] > a[]; j--) //暂存位还可以起到比较的作用
a[j + ] = a[j];
a[j + ] = a[];
}
}
a[] = ; //小洁癖,还原暂存数位为0,美观
}
insertSort(a);
console.log("插入排序:" + a); //第五种:希尔排序
var a = [, , , , , , , , , ]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
function shellSort(ar) {
var incre = ar.length - ; //初始化递增量为数组内排序的数字的长度,不包括暂存位
do {
incre = parseInt(incre / ) + ; //经研究递增量为n/3+1,n/9+1,n/27+1……时的排序效率最高,这里取n/3+1方法
for (var i = incre + ; i <= ar.length - ; i++) {
if (a[i] < a[i - incre]) {
a[] = a[i];
for (var j = i - incre; j > && a[j] > a[]; j -= incre)
a[j + incre] = a[j];
a[j + incre] = a[];
}
}
} while (incre > );
a[] = ;
}
shellSort(a);
console.log("希尔排序:" + a); //第六种:基数排序
var b = [, , , , , , , , ]; //测试基数排序的数组,定义大一点
function radixSort(arr) {
var i, j, k, lsd;
var n = ; //变量n,每次递增10倍
var t = ; //数字的最大位数递增量,从个位开始
var temp = new Array(); //创建一维数组
var count = new Array();
for (i = ; i < ; i++) {
temp[i] = new Array(arr.length); //创建二维数组
}
for (i = ; i < ; i++) { //初始化二维数组和计数数组
count[i] = ;
for (j = ; j < arr.length; j++)
temp[i][j] = ;
}
var numLength = getNumberLength(arr); //得到数的宽度,比如[337,1,22]得到为3,函数放在基数排序函数radixSort的最后
while (t++ <= numLength) { //这里循环数组数字的位数进行统计和收集 for (j = ; j < arr.length; j++) { //统计
lsd = parseInt((arr[j] / n) % ); //取得当前位数的数字
temp[lsd][count[lsd]++] = arr[j]; //将其存入二维数组temp
}
for (i = , k = ; i < ; i++) { //收集二维数组的计数存入原来的数组
if (count[i] != ) //当前的数字统计有数
for (j = ; j < count[i]; j++) //***计数数组的作用体现了,不用每次都把二维数组temp置0
arr[k++] = temp[i][j];
count[i] = ;
}
n *= ; //统计后一位数组
} function getNumberLength(a) { //计算数组的数字的最大长度,比如[337,1,22]得到为3,放在最后没关系,JS有隐式提升
var numberLength, max = ;
for (var i = ; i < a.length; i++) {
var temp = a[i];
numberLength = ;
while (temp >= ) {
temp /= ;
numberLength++;
if (temp < ) {
numberLength++;
break;
}
}
if (numberLength > max)
max = numberLength;
}
return max;
}
}
radixSort(b);
console.log("基数排序:" + b); //第七种:快速排序
var a = [, , , , , , , , ]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
function quickSort(ar, low, high) {
var povit;
if (low < high) {
povit = partition(ar, low, high);
quickSort(ar, low, povit - );
quickSort(ar, povit + , high);
}
}
//求枢轴
function partition(ar, low, high) {
var povitkey;
povitkey = ar[low]; //取最低的数作为枢轴
var temp;
while (low < high) {
while (low < high && ar[high] >= povitkey)
high--;
if (ar[high] != ar[low]) {
ar[high] ^= ar[low];
ar[low] ^= ar[high];
ar[high] ^= ar[low];
}
while (low < high && ar[low] <= povitkey)
low++;
if (ar[high] != ar[low]) {
ar[high] ^= ar[low];
ar[low] ^= ar[high];
ar[high] ^= ar[low];
}
}
return low;
}
quickSort(a, , a.length - );
console.log("快速排序:" + a); //第八种:堆排序
var a = [, , , , , , , , , ]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
function heapSort(ar) {
var i;
for (i = parseInt((ar.length - ) / ); i > ; i--) { //构建大顶堆
heapAdjust(ar, i, ar.length - );
}
for (i = ar.length - ; i > ; i--) {
//交换两个数,ar[1]和ar[i]
ar[] ^= ar[i];
ar[i] ^= ar[];
ar[] ^= ar[i];
heapAdjust(ar, , i - );
}
} function heapAdjust(ar, s, m) { //s为上标,m为下标
var temp, j;
temp = ar[s];
for (j = * s; j <= m; j *= ) {
if (j < m && ar[j + ] > ar[j]) //当右孩子比左孩子大的时候
j++;
if (temp > ar[j])
break;
ar[s] = ar[j];
s = j;
}
ar[s] = temp;
}
heapSort(a);
console.log("堆排序:" + a); //第八种:堆排序改进
var a = [, , , , , , , , ]; //第一个0是放暂存数的,为了能让后面的数有空间挪动
function heapSort(ar) {
var i;
for (i = parseInt((ar.length - ) / ) - ; i >= ; i--) { //构建大顶堆
heapAdjust(ar, i, ar.length - );
}
for (i = ar.length - ; i >= ; i--) {
//交换两个数,ar[1]和ar[i]
ar[] ^= ar[i];
ar[i] ^= ar[];
ar[] ^= ar[i];
if (i !== )
heapAdjust(ar, , i - );
}
} function heapAdjust(ar, s, m) { //s为上标,m为下标
var temp, j;
temp = ar[s];
for (j = * s; j <= m; j *= ) {
if (j < m && ar[j + ] > ar[j]) //当右孩子比左孩子大的时候
j++;
if (temp > ar[j])
break;
ar[s] = ar[j];
s = j;
}
ar[s] = temp;
}
heapSort(a);
console.log("堆排序改进:" + a);
</script>
</body> </html>

也不知道是不是最好的排序算法,学的时候是用的C语言写的,C语言的版本后面再整理吧,这里的都是JS的。

感觉高级语言封装好了太多东西,像排序只要一个sort方法就搞定了,但是自己写完才知道,后面封装了太多东西,一个排序方法可能Brenden Eich(JS发明者)已经写了几百行代码。

像Java,C#等等都封装了太多的基本代码在里面,感觉我们开发项目就是在组装电脑,拿起内存和硬盘看下型号插插插。最后剩下的就只有动手能力了。

keep fighting!:)

 

自己写的JS排序算法的更多相关文章

  1. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  2. 总结下js排序算法和乱序算法

    其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...

  3. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  4. 常用的 JS 排序算法整理

    关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...

  5. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  6. js排序算法总结—冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...

  7. js排序算法总结——冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...

  8. 结构-行为-样式-Js排序算法之 直接插入排序

    最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n&g ...

  9. js排序算法总结

    快速排序 大致分三步: 1.找基准(一般是以中间项为基准) 2.遍历数组,小于基准的放在left,大于基准的放在right 3.递归 快速排序的平均时间复杂度是O(nlogn),最差情况是O(n²). ...

随机推荐

  1. JZOJ.5257【NOIP2017模拟8.11】小X的佛光

    Description

  2. POJ 2773 Happy 2006(容斥原理+二分)

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10827   Accepted: 3764 Descr ...

  3. 浅谈数据库并发控制 - 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...

  4. 巨蟒python全栈开发数据库攻略4:多表操作&Navicat&pymysql

    1.多表查询 2.连表补充 3.boss工具=>Navicat 4.索引加速寻找工具=>everything 5.pymysql 6.pymysql初识 7.pymysql的各个方法

  5. Linux中Oracle的sqlplus下退格和Del键无效的问题解决

    利用rlwrap工具解决方法 1.安装rlwrap和readline库 CentOS下可以用EPEL的yum源直接安装,步骤如下: (1)RHEL/CentOS/SL Linux 6.x 下安装 EP ...

  6. 跳出NSDate

    感觉任何语言关于时间的格式化处理,时区的处理都是多的,最近被NSDate的各种问题坑了好久 先看看关于NSDate自己的问题 1.NSDate NSDate获取当前时间 NSDate *date=[N ...

  7. 安装 oracle 11g 发行版 出现错误:由于以下错误,Enterprise Manager配置失败,启动Database Control时出错

    解决方案如下进入dos(1)查看dbconsole状态:emctl status dbconsole 显示:Environment variable ORACLE_SID not defined. P ...

  8. windows 键盘全局钩子

    // HookapiTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #inc ...

  9. rest_framework之访问频率控制

    一  自定义频率控制类 class MyThrottle(): visitor_dic = {} def __init__(self): self.history = None def allow_r ...

  10. String StringBuffer StringBuilder 老生常谈

    1.String 与 StringBuffer . StringBuilder的区别 String 字符串常量 而 (StringBuffer 和 StringBuilder 字符串变量) 执行速度上 ...