Heim Web-Frontend js-Tutorial Javascript中的常见排序算法_javascript技巧

Javascript中的常见排序算法_javascript技巧

May 16, 2016 pm 07:16 PM
排序算法

具体代码及比较如下所示:

复制代码 代码如下:

nbsp;html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 
 
 常见排序算法 之 JavaScript版  
 
 
 
<script> <BR> Array.prototype.swap = function(i, j) <BR> { <BR> var temp = this[i]; <BR> this[i] = this[j]; <BR> this[j] = temp; <BR> } <BR> Array.prototype.bubbleSort = function() <BR> { <BR> for (var i = this.length - 1; i > 0; --i) <BR> { <BR> for (var j = 0; j < i; ++j) <BR> { <BR> if (this[j] > this[j + 1]) this.swap(j, j + 1); <BR> } <BR> } <BR> } <BR> Array.prototype.selectionSort = function() <BR> { <BR> for (var i = 0; i < this.length; ++i) <BR> { <BR> var index = i; <BR> for (var j = i + 1; j < this.length; ++j) <BR> { <BR> if (this[j] < this[index]) index = j; <BR> } <BR> this.swap(i, index); <BR> } <BR> } <BR> Array.prototype.insertionSort = function() <BR> { <BR> for (var i = 1; i < this.length; ++i) <BR> { <BR> var j = i, value = this[i]; <BR> while (j > 0 && this[j - 1] > value) <BR> { <BR> this[j] = this[j - 1]; <BR> --j; <BR> } <BR> this[j] = value; <BR> } <BR> } <BR> Array.prototype.shellSort = function() <BR> { <BR> for (var step = this.length >> 1; step > 0; step >>= 1) <BR> { <BR> for (var i = 0; i < step; ++i) <BR> { <BR> for (var j = i + step; j < this.length; j += step) <BR> { <BR> var k = j, value = this[j]; <BR> while (k >= step && this[k - step] > value) <BR> { <BR> this[k] = this[k - step]; <BR> k -= step; <BR> } <BR> this[k] = value; <BR> } <BR> } <BR> } <BR> } <BR> Array.prototype.quickSort = function(s, e) <BR> { <BR> if (s == null) s = 0; <BR> if (e == null) e = this.length - 1; <BR> if (s >= e) return; <BR> this.swap((s + e) >> 1, e); <BR> var index = s - 1; <BR> for (var i = s; i <= e; ++i) <BR> { <BR> if (this[i] <= this[e]) this.swap(i, ++index); <BR> } <BR> this.quickSort(s, index - 1); <BR> this.quickSort(index + 1, e); <BR> } <BR> Array.prototype.stackQuickSort = function() <BR> { <BR> var stack = [0, this.length - 1]; <BR> while (stack.length > 0) <BR> { <BR> var e = stack.pop(), s = stack.pop(); <BR> if (s >= e) continue; <BR> this.swap((s + e) >> 1, e); <BR> var index = s - 1; <BR> for (var i = s; i <= e; ++i) <BR> { <BR> if (this[i] <= this[e]) this.swap(i, ++index); <BR> } <BR> stack.push(s, index - 1, index + 1, e); <BR> } <BR> } <BR> Array.prototype.mergeSort = function(s, e, b) <BR> { <BR> if (s == null) s = 0; <BR> if (e == null) e = this.length - 1; <BR> if (b == null) b = new Array(this.length); <BR> if (s >= e) return; <BR> var m = (s + e) >> 1; <BR> this.mergeSort(s, m, b); <BR> this.mergeSort(m + 1, e, b); <BR> for (var i = s, j = s, k = m + 1; i <= e; ++i) <BR> { <BR> b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++]; <BR> } <BR> for (var i = s; i <= e; ++i) this[i] = b[i]; <BR> } <BR> Array.prototype.heapSort = function() <BR> { <BR> for (var i = 1; i < this.length; ++i) <BR> { <BR> for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1) <BR> { <BR> if (this[k] >= this[j]) break; <BR> this.swap(j, k); <BR> } <BR> } <BR> for (var i = this.length - 1; i > 0; --i) <BR> { <BR> this.swap(0, i); <BR> for (var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1) <BR> { <BR> if (k == i || this[k] < this[k - 1]) --k; <BR> if (this[k] <= this[j]) break; <BR> this.swap(j, k); <BR> } <BR> } <BR> } <BR> function generate() <BR> { <BR> var max = parseInt(txtMax.value), count = parseInt(txtCount.value); <BR> if (isNaN(max) || isNaN(count)) <BR> { <BR> alert("个数和最大值必须是一个整数"); <BR> return; <BR> } <BR> var array = []; <BR> for (var i = 0; i < count; ++i) array.push(Math.round(Math.random() * max)); <BR> txtInput.value = array.join("\n"); <BR> txtOutput.value = ""; <BR> } <BR> function demo(type) <BR> { <BR> var array = txtInput.value == "" ? [] : txtInput.value.replace().split("\n"); <BR> for (var i = 0; i < array.length; ++i) array[i] = parseInt(array[i]); <BR> var t1 = new Date(); <BR> eval("array." + type + "Sort()"); <BR> var t2 = new Date(); <BR> lblTime.innerText = t2.valueOf() - t1.valueOf(); <BR> txtOutput.value = array.join("\n"); <BR> } <BR></script> 
 
 
 
 
  
  
  
 
 
  
 
 
 随机数个数

 
 最大随机数

 
 



 
 耗时(毫秒):



 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 
 
  
 
 
 
 

快速排序, 插入排序, 希尔排序, 冒泡排序, quickSort, insertSort, shellSort, bubbleSort, javascript排序
说明
写这个主要是为了锻炼自己,并无实际意义。
每个浏览器测试得出的数据会不一样。比如我用chrome 测试 一般快速排序都会最快,IE 则根据数组长度有可能希尔最快。
不要用太大数据去测试冒泡排序(浏览器崩溃了我不管)
如果有兴趣可以 下载测试页面

个人理解

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

算法源码
复制代码 代码如下:

// ---------- 一些排序算法
// js 利用sort进行排序
systemSort:function(array){
return array.sort(function(a, b){
return a - b;
});
},
// 冒泡排序
bubbleSort:function(array){
var i = 0, len = array.length,
j, d;
for(; ifor(j=0; jif(array[i] d = array[j];
array[j] = array[i];
array[i] = d;
}
}
}
return array;
},
// 快速排序
quickSort:function(array){
//var array = [8,4,6,2,7,9,3,5,74,5];
//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];
var i = 0;
var j = array.length - 1;
var Sort = function(i, j){
// 结束条件
if(i == j ){ return };
var key = array[i];
var stepi = i; // 记录开始位置
var stepj = j; // 记录结束位置
while(j > i){
// j if(array[j] >= key){
j--;
}else{
array[i] = array[j]
//i++ ------------>>向后查找
while(j > ++i){
if(array[i] > key){
array[j] = array[i];
break;
}
}
}
}
// 如果第一个取出的 key 是最小的数
if(stepi == i){
Sort(++i, stepj);
return ;
}
// 最后一个空位留给 key
array[i] = key;
// 递归
Sort(stepi, i);
Sort(j, stepj);
}
Sort(i, j);
return array;
},
// 插入排序
insertSort:function(array){
// http://baike.baidu.com/image/d57e99942da24e5dd21b7080
// http://baike.baidu.com/view/396887.htm
//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];
var i = 1, j, step, key,
len = array.length;
for(; i step = j = i;
key = array[j];
while(--j > -1){
if(array[j] > key){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = key;
}
return array;
},
// 希尔排序
//Jun.array.shellSort(Jun.array.df(10000));
shellSort:function(array){
// http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
var i = 0;
var stepArrLength = stepArr.length;
var len = array.length;
var len2 = parseInt(len/2);
for(;i if(stepArr[i] > len2){
continue;
}
stepSort(stepArr[i]);
}
// 排序一个步长
function stepSort(step){
//console.log(step) 使用的步长统计
var i = 0, j = 0, f, tem, key;
var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step;

for(;i for(j=1;/*j tem = f = step * j + i;
key = array[f];
while((tem-=step) >= 0){// 依次向上查找
if(array[tem] > key){
array[tem+step] = array[tem];
}else{
break;
}
}
array[tem + step ] = key;
}
}
}
return array;
}

测试代码打包下载
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Komplexe experimentelle Designprobleme im zweiseitigen Markt von Kuaishou Komplexe experimentelle Designprobleme im zweiseitigen Markt von Kuaishou Apr 15, 2023 pm 07:40 PM

1. Hintergrund des Problems 1. Einführung in das zweiseitige Marktexperiment Der zweiseitige Markt, also eine Plattform, umfasst zwei Teilnehmer, Produzenten und Verbraucher, und beide Parteien fördern sich gegenseitig. Kuaishou hat beispielsweise einen Videoproduzenten und einen Videokonsumenten, und die beiden Identitäten können sich bis zu einem gewissen Grad überschneiden. Bilaterales Experiment ist eine experimentelle Methode, die Gruppen auf Produzenten- und Verbraucherseite vereint. Bilaterale Experimente haben folgende Vorteile: (1) Die Auswirkungen der neuen Strategie auf zwei Aspekte können gleichzeitig erfasst werden, beispielsweise Änderungen im Produkt-DAU und die Anzahl der Personen, die Werke hochladen. Bilaterale Plattformen haben oft netzwerkübergreifende Effekte, je mehr Leser es gibt, desto aktiver werden die Autoren sein, und je aktiver die Autoren sind, desto mehr Leser werden ihnen folgen. (2) Effektüberlauf und -übertragung können erkannt werden. (3) Helfen Sie uns, den Wirkungsmechanismus besser zu verstehen. Das AB-Experiment selbst kann uns nicht nur den Zusammenhang zwischen Ursache und Wirkung aufzeigen

So filtern und sortieren Sie Daten in der Vue-Technologieentwicklung So filtern und sortieren Sie Daten in der Vue-Technologieentwicklung Oct 09, 2023 pm 01:25 PM

So filtern und sortieren Sie Daten in der Vue-Technologieentwicklung. In der Vue-Technologieentwicklung sind das Filtern und Sortieren von Daten sehr häufige und wichtige Funktionen. Durch Datenfilterung und -sortierung können wir die benötigten Informationen schnell abfragen und anzeigen und so die Benutzererfahrung verbessern. In diesem Artikel wird das Filtern und Sortieren von Daten in Vue vorgestellt und spezifische Codebeispiele bereitgestellt, um den Lesern zu helfen, diese Funktionen besser zu verstehen und zu verwenden. 1. Datenfilterung Datenfilterung bezieht sich auf das Herausfiltern von Daten, die den Anforderungen basierend auf bestimmten Bedingungen entsprechen. In Vue können wir comp bestehen

Google nutzt KI, um das Zehn-Jahres-Ranking-Algorithmus-Siegel zu brechen. Es wird jeden Tag Billionen Mal ausgeführt, aber Internetnutzer sagen, es sei die unrealistischste Forschung? Google nutzt KI, um das Zehn-Jahres-Ranking-Algorithmus-Siegel zu brechen. Es wird jeden Tag Billionen Mal ausgeführt, aber Internetnutzer sagen, es sei die unrealistischste Forschung? Jun 22, 2023 pm 09:18 PM

Organisieren |. Nuka-Cola, Chu Es ist eine interessante Herausforderung und es gibt viele Möglichkeiten, sie zu meistern. Es wurde viel Zeit investiert, um herauszufinden, wie Sortieraufgaben effizienter erledigt werden können. Als Grundoperation sind Sortieralgorithmen in die Standardbibliotheken der meisten Programmiersprachen integriert. Es gibt viele verschiedene Sortiertechniken und Algorithmen, die in Codebasen auf der ganzen Welt verwendet werden, um große Datenmengen online zu organisieren, aber zumindest was die mit dem LLVM-Compiler verwendeten C++-Bibliotheken betrifft, hat sich der Sortiercode seit mehr als einem Jahr nicht geändert Jahrzehnt. Kürzlich hat das Google DeepMindAI-Team nun eine entwickelt

So verwenden Sie den Radix-Sortieralgorithmus in C++ So verwenden Sie den Radix-Sortieralgorithmus in C++ Sep 19, 2023 pm 12:15 PM

So verwenden Sie den Basissortieralgorithmus in C++. Der Basissortierungsalgorithmus ist ein nicht vergleichender Sortieralgorithmus, der die Sortierung durch Aufteilen der zu sortierenden Elemente in einen begrenzten Satz von Ziffern abschließt. In C++ können wir den Radix-Sortieralgorithmus verwenden, um eine Menge von Ganzzahlen zu sortieren. Im Folgenden besprechen wir anhand konkreter Codebeispiele ausführlich, wie der Basissortieralgorithmus implementiert wird. Algorithmusidee Die Idee des Radix-Sortieralgorithmus besteht darin, die zu sortierenden Elemente in einen begrenzten Satz digitaler Bits zu unterteilen und die Elemente dann nacheinander nach jedem Bit zu sortieren. Die Sortierung nach jedem Bit ist abgeschlossen

So implementieren Sie den Auswahlsortierungsalgorithmus in C# So implementieren Sie den Auswahlsortierungsalgorithmus in C# Sep 20, 2023 pm 01:33 PM

So implementieren Sie den Auswahlsortierungsalgorithmus in C#. Die Auswahlsortierung (SelectionSort) ist ein einfacher und intuitiver Sortieralgorithmus. Seine Grundidee besteht darin, jedes Mal das kleinste (oder größte) Element aus den zu sortierenden Elementen auszuwählen und am Ende einzufügen die sortierte Reihenfolge. Wiederholen Sie diesen Vorgang, bis alle Elemente sortiert sind. Erfahren Sie mehr darüber, wie Sie den Auswahlsortierungsalgorithmus in C# implementieren, zusammen mit spezifischen Codebeispielen. Erstellen einer Auswahlsortierungsmethode Zuerst müssen wir eine Methode zur Implementierung der Auswahlsortierung erstellen. Diese Methode akzeptiert a

Swoole Advanced: So verwenden Sie Multithreading, um einen Hochgeschwindigkeits-Sortieralgorithmus zu implementieren Swoole Advanced: So verwenden Sie Multithreading, um einen Hochgeschwindigkeits-Sortieralgorithmus zu implementieren Jun 14, 2023 pm 09:16 PM

Swoole ist ein leistungsstarkes Netzwerkkommunikations-Framework, das auf der PHP-Sprache basiert. Es unterstützt die Implementierung mehrerer asynchroner E/A-Modi und mehrerer erweiterter Netzwerkprotokolle. Basierend auf Swoole können wir seine Multithreading-Funktion nutzen, um effiziente Algorithmusoperationen zu implementieren, beispielsweise Hochgeschwindigkeits-Sortieralgorithmen. Der Hochgeschwindigkeits-Sortieralgorithmus (QuickSort) ist ein gängiger Sortieralgorithmus. Durch die Lokalisierung eines Benchmark-Elements werden die Elemente, die kleiner als das Benchmark-Element sind, auf der linken Seite platziert, und diejenigen, die größer oder gleich dem Benchmark sind Element werden auf der rechten Seite platziert. Dann werden die linke und die rechte Teilsequenzrekursion platziert

Welche Sortieralgorithmen gibt es für Arrays? Welche Sortieralgorithmen gibt es für Arrays? Jun 02, 2024 pm 10:33 PM

Array-Sortieralgorithmen werden verwendet, um Elemente in einer bestimmten Reihenfolge anzuordnen. Zu den gängigen Arten von Algorithmen gehören: Blasensortierung: Vertauschen Sie Positionen durch Vergleichen benachbarter Elemente. Auswahlsortierung: Finden Sie das kleinste Element und tauschen Sie es an die aktuelle Position aus. Einfügungssortierung: Elemente einzeln an der richtigen Position einfügen. Schnelle Sortierung: Divide-and-Conquer-Methode, wählen Sie das Pivot-Element aus, um das Array zu teilen. Zusammenführungssortierung: Teilen und Erobern, rekursives Sortieren und Zusammenführen von Unterarrays.

Diskussion über Anwendungsszenarien verschiedener PHP-Array-Sortieralgorithmen Diskussion über Anwendungsszenarien verschiedener PHP-Array-Sortieralgorithmen Apr 28, 2024 am 09:39 AM

Für verschiedene Szenarien ist es entscheidend, den geeigneten PHP-Array-Sortieralgorithmus auszuwählen. Die Blasensortierung eignet sich für kleine Arrays ohne Stabilitätsanforderungen. Die schnelle Sortierung weist in den meisten Fällen eine hohe Stabilität auf und eignet sich für Situationen, in denen stabile Ergebnisse erforderlich sind ; Heap-Sortierung findet effizient den Maximal- oder Minimalwert. Durch den Vergleich tatsächlicher Fälle ist die schnelle Sortierung anderen Algorithmen hinsichtlich der Zeiteffizienz überlegen. Wenn jedoch Stabilität berücksichtigt werden muss, sollte die Zusammenführungssortierung gewählt werden.

See all articles