Kaip tinkamai rūšiuoti sveikųjų skaičių masyvą

Bandymas gauti didžiausią ir mažiausią vertę iš masyvo, kurį aš žinau, bus tik sveiki, atrodo sunkiau, nei maniau.

30 июня '09 в 13:43 2009-06-30 13:43 peirix yra nustatytas birželio 30 d ., 09:43, 2009-06-30 13:43
@ 22 atsakymai

Pagal nutylėjimą, rūšiavimo metodas rūšiuoja elementus abėcėlės tvarka. Skaitmeniniam rūšiavimui tiesiog pridėkite naują metodą, kuris tvarko skaitines rūšis (toliau pateikiamas rūšiavimo numeris) -

EDIT: naudojant ES6 rodyklių funkcijas:

 numArray.sort((a, b) => a - b); // For ascending sort numArray.sort((a, b) => b - a); // For descending sort 
885
30 июня '09 в 13:47 2009-06-30 13:47 atsakymas pateikiamas aks birželio 30 d., 09:47, 2009-06-30 13:47

Tik remiantis visais pirmiau pateiktais atsakymais, jie taip pat gali būti vykdomi vienoje eilutėje taip:

 var numArray = [140000, 104, 99]; // ES5 numArray = numArray.sort(function (a, b) { return a - b; }); // ES2015 numArray = numArray.sort((a, b) => a - b); //outputs: 99, 104, 140000 
151
06 февр. Atsakymą pateikė MarzSocks 06 vasaris 2014-02-06 09:07 '14 at 9:07 2014-02-06 09:07

array.sort daro numatytąją leksikografinę formą skaitmeninei rūšiavimui, suteikia jūsų pačių funkciją. Štai paprastas pavyzdys:

 function compareNumbers(a, b) { return a - b; } numArray.sort(compareNumbers); 

Taip pat atkreipkite dėmesį, kad rūšiavimo darbai „vietoje“, priskyrimas nebūtinas.

68
30 июня '09 в 13:47 2009-06-30 13:47 atsakymą pateikė Paul Dixon birželio 30 d., 13:47 2009-06-30 13:47

Šis atsakymas yra lygiavertis kai kuriems esamiems atsakymams, tačiau ECMAScript 6 rodyklės funkcijos suteikia daug kompaktiškesnę sintaksę, kuri leidžia mums apibrėžti integruotą rūšiavimo funkciją neprarandant skaitymo:

 numArray = numArray.sort((a, b) => a - b); 

Šiuo metu dauguma naršyklių yra palaikomos.

35
03 февр. atsakymas duotas jjjjs 03 vasaris 2016-02-03 23:07 '16 at 23:07 2016-02-03 23:07

Aš sutinku su aks, tačiau vietoj to

 return a - b; 

Jūs turite naudoti

 return a > b ? 1 : a < b ? -1 : 0; 
14
18 нояб. Atsakymą pateikė vartotojo3587638 18 nov. 2014-11-18 22:41 '14, 10:41 pm 2014-11-18 22:41

Priežastis, kodėl rūšiavimo funkcija elgiasi taip keistai

dokumentacijos :

[...] masyvas yra rūšiuojamas pagal kiekvieną Unicode kodo taško simbolių vertę pagal kiekvieno elemento eilutės transformaciją.

Jei spausdinsite masyvo Unicode taškų reikšmes, tai bus aišku.

 console.log("40000".charCodeAt(0)); console.log("04".charCodeAt(0)); //Note that we only look at the first index of the number "charCodeAt( 0 )" 
 52 (unicode value of first number at 40000) 40 (unicode value of first number at 04) 

Jei rūšiuojame, mes gauname:

 40 (unicode value of first number at 04) 52 (unicode value of first number at 40000) 

todėl 104 yra 140 000.

Taigi galutinis rezultatas bus:

14
26 мая '18 в 10:07 2018-05-26 10:07 atsakymas pateikiamas „ Black “ gegužės 26 d. 18 val. 10:07 2018-05-26 10:07

JavaScript sistemoje numatytasis rūšiavimo () metodo elgesys yra rūšiuoti reikšmes masyve abėcėlės tvarka.

Jei norite surūšiuoti pagal skaičių, turite nustatyti skaitmeninę rūšiavimo funkciją (kuri yra labai paprasta):

 ... function sortNumber(a, b) { return a - b; } numArray = numArray.sort(sortNumber); 
10
30 июня '09 в 13:48 2009-06-30 13:48 atsakymą pateikė vartotojo130076 birželio 30 d. 13:48 2009-06-30 13:48

Array.prototype.sort () yra masyvų rūšiavimo metodas, tačiau yra keletas problemų, apie kurias reikia žinoti.

Numatytoji rūšiavimo tvarka yra leksikografinė, o ne skaitinė, nepriklausomai nuo masyvo reikšmių. Net jei masyvas yra visi skaičiai, visos vertės bus konvertuojamos į eilutę ir surūšiuotos leksikografiškai.

Todėl reikia konfigūruoti rūšiavimo () ir atvirkštinio () metodus, kaip parodyta žemiau.

URL nuoroda

Rūšiuoti numerius masyvo viduje

 numArray.sort(function(a, b) { return a - b; }); 

Norėdami pakeisti numerius masyvo viduje

 numArray.sort(function(a, b) { return b - a; }); 

URL nuoroda

8
02 марта '16 в 10:53 2016-03-02 10:53 atsakymą pateikė merbin joe kovo 2 d. 16 d. 10:53 2016-03-02 10:53

Į klausimą jau buvo atsakyta, trumpiausias būdas yra naudoti sort() metodą. Bet jei ieškote daugiau būdų, kaip surūšiuoti numerių masyvą ir taip pat mylėti ciklus, patikrinkite šiuos dalykus

Įdėkite rūšiavimą

didėjantis:

4
26 июня '16 в 21:34 2016-06-26 21:34 atsakymas pateikiamas Komercinė savižudybė birželio 26 d. 16:34 2016-06-26 21:34

Naujuoju ES6 pasauliu yra daug lengviau padaryti

 numArray.sort((a,b) => ab); 

Tai viskas, ko jums reikia :)

3
16 нояб. Atsakymą pateikė Chait Nov. 16. 2018-11-16 21:17 '18, 9:17 val. 2018-11-16 21:17

Išbandykite šį kodą, kaip parodyta žemiau.

 var a = [5, 17, 29, 48, 64, 21]; function sortA(arr) { return arr.sort(function(a, b) { return a - b; }) ;} alert(sortA(a)); 
2
07 февр. atsakymą pateikė vartotojo7125929 07 vasaris 2018-02-07 13:58 '18 at 13:58 pm 2018-02-07 13:58

Esu nustebintas, kodėl visi rekomenduoja perimti palyginimo funkciją, kad būtų galima sort() , todėl rūšiavimas yra labai lėtas!

Jei norite rūšiuoti numerius, tiesiog sukurkite bet kurį „ TypedArray“ :

2
18 нояб. atsakymas suteiktas dy_ 18 lapkričio. 2018-11-18 00:01 '18 0:01, 2018-11-18 00:01

Tik įprastai elementų reikšmių grupei:

 function sortArrayOfElements(arrayToSort) { function compareElements(a, b) { if (a < b) return -1; if (a > b) return 1; return 0; } return arrayToSort.sort(compareElements); } eg 1: var array1 = [1,2,545,676,64,2,24] **output : [1, 2, 2, 24, 64, 545, 676]** var array2 = ["v","a",545,676,64,2,"24"] **output: ["a", "v", 2, "24", 64, 545, 676]** 

Objektų masyvui:

 function sortArrayOfObjects(arrayToSort, key) { function compareObjects(a, b) { if (a[key] < b[key]) return -1; if (a[key] > b[key]) return 1; return 0; } return arrayToSort.sort(compareObjects); } eg 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}] **output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]** 
2
07 февр. atsakymas duotas Umesh 07 vasaris . 2018-02-07 14:04 '18, 14:04 val. 2018-02-07 14:04

neapdorotam apdorojimui, nulinis ir NaN: Nullas veikia kaip 0, NaN ir neribotas eina iki galo.

 array = [3, 5, -1, 1, NaN, 6, undefined, 2, null] array.sort((a,b) => isNaN(a) || ab) // [-1, null, 1, 2, 3, 5, 6, NaN, undefined] 
1
12 окт. Ali Khosro atsakymas, pateiktas spalio 12 d 2018-10-12 01:40 '18 prie 1:40 2018-10-12 01:40

Atnaujinti! Slinkite žemyn į atsakymo apačioje esantį „ smartSort priedų priedą, kuris suteikia jums dar daugiau įdomumo!
Rūšiuoja masyvus nieko !

Mano asmeninė mėgstamiausia šios funkcijos forma leidžia nurodyti didėjimo arba mažėjimo parametrą:

 function intArraySort(c, a) { function d(a, b) { return b - a; } "string" == typeof a  a.toLowerCase(); switch (a) { default: return c.sort(function(a, b) { return a - b; }); case 1: case "d": case "dc": case "desc": return c.sort(d) } }; 

Naudojimas yra toks paprastas kaip:

 var ara = function getArray() { var a = Math.floor(Math.random()*50)+1, b = []; for (i=0;i<=a;i++) b.push(Math.floor(Math.random()*50)+1); return b; }(); // Ascending intArraySort(ara); console.log(ara); // Descending intArraySort(ara, 1); console.log(ara); // Ascending intArraySort(ara, 'a'); console.log(ara); // Descending intArraySort(ara, 'dc'); console.log(ara); // Ascending intArraySort(ara, 'asc'); console.log(ara); 

jsFiddle


Arba čia įveskite kodo fragmentą!

 table { border-collapse: collapse; } th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; } .asc { color: red; } .desc { color: blue } 

jsFiddle Array.prototype.smartSort ('asc | desc')


Naudojimas yra paprastas! Pirmiausia sukurkite beprotišką masyvą:

 window.z = [ 'one', undefined, $('<span />'), 'two', null, 2, $('<div />', { id: 'Thing' }), $('<div />'), 4, $('<header />') ]; z.push(new Date('1/01/2011')); z.push('three'); z.push(undefined); z.push([ 'one', 'three', 'four' ]); z.push([ 'one', 'three', 'five' ]); z.push({ a: 'a', b: 'b' }); z.push({ name: 'bob', value: 'bill' }); z.push(new Date()); z.push({ john: 'jill', jack: 'june' }); z.push([ 'abc', 'def', [ 'abc', 'def', 'cba' ], [ 'cba', 'def', 'bca' ], 'cba' ]); z.push([ 'cba', 'def', 'bca' ]); z.push({ a: 'a', b: 'b', c: 'c' }); z.push({ a: 'a', b: 'b', c: 'd' }); 

Tada tiesiog surinkite!

 z.smartSort('asc'); // Ascending z.smartSort('desc'); // Descending 

Tik metodas

Tas pats kaip ir ankstesnis, išskyrus paprastą metodą!

   window.smartSort=function(){if(arguments){var a,b,c;for(c in arguments)arguments[c]instanceof Array 0==b arguments[c] instanceof Array)return a.sort("a"==b?smartSort.asc:smartSort.desc)}return this.sort()};smartSort.asc=function(a,b){if(null==a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return ab;if(/^stringstring$/ig.test(e))return a> b;if(/(string|number){2}/ig.test(e))return/string/i.test(c)?1:-1;if(/number/ig.test(e) instanceof Array instanceof Array instanceof Date instanceof Date)return ab;if(a instanceof Array instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=smartSort(e.concat(g),"a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=smartSort([a[c], b[c]],"a"),a[c]==d[0]?-1:1;var f=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"a");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element instanceof Element){if(a.tagName==b.tagName)return e=smartSort([a.id,b.id],"a"),a.id==e[0]?1:-1;e=smartSort([a.tagName,b.tagName],"a");return a.tagName==e[0]?1:-1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);smartSort(e.concat(g), "a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d) Element Element){if(a[d].tagName==b[f].tagName)return c=smartSort([a[d].id,b[f].id],"a"),a[d].id==c[0]?-1:1;c=smartSort([a[d].tagName,b[f].tagName],"a");return a[d].tagName==c[0]?-1:1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=smartSort([a[d],b[f]],"a"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d) Element)return 1; if(b.hasOwnProperty(f) Element||!a.hasOwnProperty(d))return-1;if(!b.hasOwnProperty(d))return 1}c=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"a");return a[Object.keys(a)[0]]==c[0]?1:-1}g=[a,b].sort();return g[0]>g[1]};smartSort.desc=function(a,b){if(null==a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return ba;if(/^stringstring$/ig.test(e))return b>a;if(/(string|number){2}/ig.test(e))return/string/i.test(c)? 1:-1;if(/number/ig.test(e) instanceof Array instanceof Array instanceof Date instanceof Date)return ba;if(a instanceof Array instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=smartSort(e.concat(g),"a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=smartSort([a[c],b[c]],"d"),a[c]==d[0]?-1:1;var f=smartSort([a[Object.keys(a)[0]], b[Object.keys(b)[0]]],"d");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element instanceof Element){if(a.tagName==b.tagName)return e=smartSort([a.id,b.id],"d"),a.id==e[0]?-1:1;e=smartSort([a.tagName,b.tagName],"d");return a.tagName==e[0]?-1:1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);smartSort(e.concat(g),"a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d) b.hasOwnProperty(f)){if(a[d]instanceof Element Element){if(a[d].tagName==b[f].tagName)return c=smartSort([a[d].id,b[f].id],"d"),a[d].id==c[0]?-1:1;c=smartSort([a[d].tagName,b[f].tagName],"d");return a[d].tagName==c[0]?-1:1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=smartSort([a[d],b[f]],"d"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d) Element)return 1;if(b.hasOwnProperty(f) Element)return-1; if(!a.hasOwnProperty(d))return 1;if(!b.hasOwnProperty(d))return-1}c=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"d");return a[Object.keys(a)[0]]==c[0]?-1:1}g=[a,b].sort();return g[0]<g[1]}  

Naudoti:

 z = smartSort(z, 'asc'); // Ascending z = smartSort(z, 'desc'); // Descending 

jsFiddle smartSort metodas („Array“, „asc | desc“)

1
07 дек. atsakymas duotas SpYk3HH 07 dec. 2014-12-07 22:02 '14, 10:02 pm 2014-12-07 22:02

Išbandykite šį kodą:

HTML:

 <div id="demo"></div> 

„JavaScript“ kodas:

 <script> (function(){ var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = points; points.sort(function(a, b){return ab}); document.getElementById("demo").innerHTML = points; })(); </script> 
1
17 нояб. Atsakymas pateikiamas „ Sunny SM Nov 17“. 2015-11-17 08:48 '15, 8:48, 2015-11-17 08:48

// mano kodas, kad numeris būtų įtrauktas į tinkamą vietą sąraše

  int nr = 5; // just a test number boolean foundPlace = false; for(int i = 0; i < integerList.size(); i++){ if(nr <= integerList.get(i)){ integerList.add(i,nr); foundPlace = true; break; } } if (!foundPlace) integerList.add(integerList.size(), nr); 

"integerList.add (elementas)" įterpia nurodytą elementą į nurodytą poziciją šiame sąraše. Atitinkamai perkelia kitus elementus.

0
04 дек. Atsakymas duotas Dan Alboteanu 04 gruodis. 2017-12-04 09:07 '17 at 9:07 2017-12-04 09:07

Daugeliu atvejų laikysiuosi kitų atsakymuose siūlomo metodo - tai yra, sukurkite daugybę galimybių, sumaišykite jį ir imkite pirmas n reikšmes kaip pavyzdį.

Tačiau tai nėra labai gerai, jei galimybių diapazonas yra didelis, palyginti su kiek atminties, kurią norite naudoti, arba palyginti su tuo, kiek atsitiktinių verčių norite išgauti.

Sprendimas, panašus į siūlomą jūsų klausimą, gali atrodyti taip:

 function randomNumbersWithoutReplacement(n, from, to, randomSource = Math.random) { const possibilities = Array.from({length: to - from + 1}, (_, i) => i + from); const result = [] for (let i = 0; i < n; ++i) { const index = Math.floor(randomSource() * possibilities.length) result.push(possibilities.splice(index, 1)[0]) } // sorted for beauty result.sort() return result } 

Ir kodėl jums to reikia?

es6 ir reaguokite daug gražiai nei kai kurie iš šių labai sudėtingų atsakymų. Pakeiskite this.state.ages masyvu, kurį norite filtruoti.

 const filter = this.state.ages.filter(filter => filter >=0); 
-3
04 дек. Atsakymą pateikė TheBetterJORT 04 Dec. 2017-12-04 09:07 '17 at 9:07 2017-12-04 09:07

Kiti klausimai apie etiketes arba Užduoti klausimą