JavaScript版几种常见排序算法

今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html

算法描述:

* 冒泡排序:最简单,也最慢,貌似长度小于7最优
* 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势
* 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合
* 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快
* 系统方法:在forfox下系统的这个方法非常快

  1 // ---------- 一些排序算法
  2 // js 利用sort进行排序
  3 systemSort: function(array) {
  4     return array.sort(function(a, b) {
  5         return a - b;
  6     });
  7 },
  8 // 冒泡排序
  9 bubbleSort: function(array) {
 10     var i = 0,
 11     len = array.length,
 12     j, d;
 13     for (; i < len; i++) {
 14         for (j = 0; j < len; j++) {
 15             if (array[i] < array[j]) {
 16                 d = array[j];
 17                 array[j] = array[i];
 18                 array[i] = d;
 19             }
 20         }
 21     }
 22     return array;
 23 },
 24 // 快速排序
 25 quickSort: function(array) {
 26     //var array = [8,4,6,2,7,9,3,5,74,5];
 27     //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
 28     var i = 0;
 29     var j = array.length - 1;
 30     var Sort = function(i, j) {
 31
 32         // 结束条件
 33         if (i == j) {
 34             return
 35         };
 36
 37         var key = array[i];
 38         var stepi = i; // 记录开始位置
 39         var stepj = j; // 记录结束位置
 40         while (j > i) {
 41             // j <<-------------- 向前查找
 42             if (array[j] >= key) {
 43                 j--;
 44             } else {
 45                 array[i] = array[j]
 46                 //i++ ------------>>向后查找
 47                 while (j > ++i) {
 48                     if (array[i] > key) {
 49                         array[j] = array[i];
 50                         break;
 51                     }
 52                 }
 53             }
 54         }
 55
 56         // 如果第一个取出的 key 是最小的数
 57         if (stepi == i) {
 58             Sort(++i, stepj);
 59             return;
 60         }
 61
 62         // 最后一个空位留给 key
 63         array[i] = key;
 64
 65         // 递归        Sort(stepi, i);
 66         Sort(j, stepj);
 67     }
 68
 69     Sort(i, j);
 70
 71     return array;
 72 },
 73
 74 // 插入排序
 75 insertSort: function(array) {
 76
 77     // http://baike.baidu.com/image/d57e99942da24e5dd21b7080
 78     // http://baike.baidu.com/view/396887.htm
 79     //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
 80     var i = 1,
 81     j, step, key, len = array.length;
 82
 83     for (; i < len; i++) {
 84
 85         step = j = i;
 86         key = array[j];
 87
 88         while (--j > -1) {
 89             if (array[j] > key) {
 90                 array[j + 1] = array[j];
 91             } else {
 92                 break;
 93             }
 94         }
 95
 96         array[j + 1] = key;
 97     }
 98
 99     return array;
100 },
101
102 // 希尔排序
103 //Jun.array.shellSort(Jun.array.df(10000));
104 shellSort: function(array) {
105
106     // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
107     // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
108     var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
109     //var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
110     var i = 0;
111     var stepArrLength = stepArr.length;
112     var len = array.length;
113     var len2 = parseInt(len / 2);
114
115     for (; i < stepArrLength; i++) {
116         if (stepArr[i] > len2) {
117             continue;
118         }
119
120         stepSort(stepArr[i]);
121     }
122
123     // 排序一个步长
124     function stepSort(step) {
125
126         //console.log(step) 使用的步长统计
127         var i = 0,
128         j = 0,
129         f, tem, key;
130         var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len / step;
131
132         for (; i < step; i++) { // 依次循环列
133             for (j = 1;
134             /*j < stepLen && */
135             step * j + i < len; j++) { //依次循环每列的每行
136                 tem = f = step * j + i;
137                 key = array[f];
138
139                 while ((tem -= step) >= 0) { // 依次向上查找
140                     if (array[tem] > key) {
141                         array[tem + step] = array[tem];
142                     } else {
143                         break;
144                     }
145                 }
146
147                 array[tem + step] = key;
148
149             }
150         }
151
152     }
153
154     return array;
155
156 }
时间: 2024-12-18 20:28:53

JavaScript版几种常见排序算法的相关文章

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

Java中几种常见排序算法

日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. * 冒泡法排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应

几种常见排序算法的总结

下面总结几种常见的排序算法,包括插入排序.选择排序.快速排序.归并排序和堆排序. 时间复杂度: 插入排序 选择排序 快速排序 归并排序 堆排序 Ο(n2) Ο(n2) Ο(nlog(n)) Ο(nlog(n)) Ο(nlog(n)) 算法概述: 插入排序:每次从未排好序的数据堆中拿出一个数,插入到已排好序的数据队列的正确位置. 选择排序:每次从未排好序的数据堆中找到最小的数,插入到已排好序的数据队列的头部. 快速排序:以数据堆中的一个数为标准,将数据堆分为小于等于和大于该数的两堆,对于分割后的两

几种常见排序算法的基本介绍,性能分析,和c语言实现

本文介绍7种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚,本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换函数swap, 在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int le

Java实现9种常见排序算法

常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import java.util.Arrays; /** * @ProjectName SortingAlgorithm * @PackageName com.buaa * @ClassName BubbleSort * @Description 冒泡排序 * @Author 刘吉超 * @Date 2016-05

php几种常见排序算法

<?php //从时间上来看,快速排序和归并排序在时间上比较有优势,//但是也比不上sort排序,归并排序比较占用内存! $arr = [4,6,1,2,3,89,56,34,56,23,65];/** * 冒泡排序 * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成 */function BubbleSortq($arr) { $len = count($arr); //设置一个空

几种常见排序算法的C++描述

1.首先当然是插入排序啦,算法的时间复杂度其实是O(N^2)的 先来个一般的描述: 1 template<typename Comparable> 2 void insertSort(vector<Comparable> & a) 3 { 4 int j; 5 for (int p = 1; p < a.size(); p++) 6 { 7 Comparable tmp = a[p]; 8 for (int j = p - 1; j > 0 &&

5种常见排序算法原理&amp;C语言实现

一.冒泡排序(以下各法均以从小到大排序为例,定义len为数组array的长度) 原理:比较相邻元素的大小,对于每次循环,按排序的规则把最值移向数组的一端,同时循环次数依次减少. C代码实现 写法一: //从数组头部开始,某一个元素与其后面的每个元素作比较for(i=0;i<len-1;i++) for(j=i+1;j<len;j++) { if(array[i]>array[j]) { t=array[i];array[i]=array[j];array[j]=t; } } 写法二: /

C语言中的几种常见排序算法

1.冒泡排序法:如果有N个数,两两相邻进行比较,将最值沉入最后一位置,要进行N-1轮比较, 第一轮要比较N-1次,第2轮只要比较N-1-1次,因为第一次已经把最值沉入最后一位置,故 不需在进行比较一次,也就是说每一轮都减少一次,所以第2个for循环中j < n-1;下列代码是升序排序 1 void bubble_sort(int *num, int n) 2 { 3 int num_temp; 4 for (int i=0; i<n; i++) 5 for (int j=0; j<n-i