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

<!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. iOS 断当前时间是否在一天的某个时间段内。

    应用中设置一般会存在这样的设置,如夜间勿扰模式,从8:00-23:00,此时如何判断当前时间是否在该时间段内.难点主要在于如何用NSDate生成一个8:00的时间和23:00的时间,然后用当前的时间跟 ...

  2. string 转 java对象、转map的方式

    1.使用fastJson 将String转 map: String out; Object succesResponse = JSON.parse(out);    //先转换成Object Map ...

  3. Spoken English Practice(not always estimating your status in other's hearts. you will lose yourself when you live in other's look. do your best and walk on you own way.)

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/7/8) 英 ...

  4. Exchange Version and UpdateRollups

    Exchange Server 2010 Product name Build number Date KB Microsoft Exchange Server 2010 RTM 14.0.639.2 ...

  5. 机器被感染病毒文件zigw的处理流程

    1.现象 服务器CPU报警,查看时,已接近100%. 2.查找 使用top查看是哪个进程在占用CPU,此时zigw立刻出现,记录下进程的PID,假如为12345. (1) 如果在不知道程序的路径前,就 ...

  6. Commit message 的写法规范。本文介绍Angular 规范(

    Commit message 的写法规范.本文介绍Angular 规范( http://www.ruanyifeng.com/blog/2016/01/commit_message_change_lo ...

  7. C#中Windows通用的回车转Tab方法

    标签: windowsc#textboxbuttondropdownobject 2007-03-28 09:37 2773人阅读 评论(0) 收藏 举报  分类: C#(5)  版权声明:本文为博主 ...

  8. Restful风格到底是什么?怎么应用到我们的项目中?

    rest越来越流行,感觉挺高大尚的.网上看了很多网友的说法,各有各的看法,我觉得很多说得很有道理. 说法一 restful风格,就是一种面向资源服务的API设计方式,它不是规范,不是标准,它一种设计模 ...

  9. pycharm的MySQLdb模块导不进去时解决办法

    一.Windows下python2.7安装MySQLdb模块 根据Python多少位下载对应版本: 32位:https://pypi.python.org/pypi/MySQL-python/1.2. ...

  10. USB 3.0:那些你需要知道的事

    在过去14年来,通用串行总线(USB)已成为计算机和外部设备之间的标准接口.不管是移动硬盘.相机.鼠标.键盘.打印机,还是扫描仪,它们和计算机之间的数据传输一般均采用USB线.USB接口也的确是“通用 ...