am_dot_com

SW20210512

May 12th, 2021 (edited)
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Arrays - Procuras, Ordenações</title>
  6. </head>
  7. <body>
  8. <script>
  9. //procuras
  10. function blindSearch(
  11. pElemento,
  12. pCol
  13. ){
  14. var bCautela = Array.isArray(pCol);
  15. if (bCautela){
  16. var iQuantosElementos = pCol.length;
  17.  
  18. for (
  19. //zona de inits
  20. var idx=0,
  21. aOndeFoiEncontradoOElemento = new Array(), //v2
  22. iQuantasVezesEncontreiOElemento = 0; //v3
  23.  
  24. //zona de continuidade
  25. idx<=iQuantosElementos-1;
  26.  
  27. //zona de auto-update
  28. idx+=1
  29. )
  30. {
  31. var oElementoDoMomento = pCol[idx];
  32. var bEncontreiOQueProcuro = oElementoDoMomento === pElemento;
  33. //if (bEncontreiOQueProcuro) return true; //v1 Claude Shannon
  34. //v2
  35. if (bEncontreiOQueProcuro){
  36. aOndeFoiEncontradoOElemento.push(idx);
  37. iQuantasVezesEncontreiOElemento+=1;
  38. }
  39. }
  40. //return false; //v1
  41. //return aOndeFoiEncontradoOElemento; //v2
  42. return {
  43. "onde" : aOndeFoiEncontradoOElemento,
  44. "quantas" : iQuantasVezesEncontreiOElemento
  45. }
  46. }//if
  47. }//blindSearch
  48.  
  49. var a = [1, 2, 2, 3, 10, 20, 10];
  50. var oJSON /*acrónimo*/ = blindSearch(
  51. desejado = 10,
  52. a
  53. );
  54.  
  55. //3 informações extraíveis do mesmo algoritmo de procura
  56. var bExiste = oJSON.quantas>0;
  57.  
  58. /*
  59. if (oJSON.quantas===0)
  60. bExiste = false;
  61. else
  62. bExiste = true;
  63. */
  64.  
  65. var iQuantasVezes = oJSON.quantas;
  66. var aOndeEstava = oJSON.onde;
  67. document.write
  68. ("Encontrei o elemento "+desejado+ " "+iQuantasVezes+" vez(es)<br>");
  69.  
  70. document.write
  71. ("<br>Encontrei o elemento "+desejado+ " nas posições "+aOndeEstava+"<br>");
  72.  
  73. document.write("<hr>");
  74.  
  75. //ordenações
  76. //o algoritmo de ordenação +simples q me ocorre (e também o menos eficiente)
  77. //é o "bubble sort"
  78. /*
  79. dada uma coleção (qualquer)
  80. enquanto a coleção NÃO ESTIVER ODENADA
  81. para ordená-la ASCENDENTEMENTE (do menor para o maior dos elementos)
  82. para ordená-la DESCENDENTE (do maior para o nenor dos elementos)
  83. vamos passear-nos
  84. do primeiro ao PENÚLTIMO elemento da coleção
  85. a cada passo deste passeio, queremos prestar atenção,
  86. ao elemento corrente *e* ao seu vizinho
  87. (idx) (idx+1)
  88. sempre que encontrarmos um elemento concreto que é "maior" >
  89. sempre que encontrarmos um elemento concreto que é "menor" <
  90. que o seu "vizinho" deveremos
  91. trocá-los
  92. *e*
  93. tomar nota que fizémos trocas
  94.  
  95. exemplo ilustrado
  96. [3, 2, 1] //não está ordenada asc
  97. 0: 3@0 > 2@0+1 => 3>2 true
  98. [2, 3, 1] //fiz trocas
  99. 1: 3@1 > 1@1+1 => 3>1 true => trocar os elementos nas posições 1 e 2
  100. [2, 1, 3] //não está ordenada asc
  101. FIM DO PASSEIO #1 : houve trocas? sim (houve duas)
  102. [2, 1, 3]
  103. 0: 2@0 > 1@1 true trocar(2@0, 1@1)
  104. [1, 2, 3]
  105. 1: 2@1 > 3@2 2>3 false NO trocar
  106. FIM DO PASSEIO #2 : houve trocas? sim (houve uma troca)
  107. [1, 2, 3]
  108. 0: 1@0 > 2@1 false NO trocas
  109. 1: 2@1 > 3@2 false NO trocas
  110. FIM DO PASSEIO #3 : houve trocas? NÃO (ordenada!)
  111. */
  112.  
  113. function bubbleSort(
  114. pCol
  115. )
  116. {
  117. var iPrimeiro=0, iPenultimo, bOrdenada=false, bFizTrocas=false;
  118. var bCautela = Array.isArray(pCol) && pCol.length>0;
  119. if (bCautela){
  120. while (!bOrdenada) {
  121. for (
  122. iAtual = iPrimeiro,
  123.  
  124. /*
  125. em JS, pq os arrays são indexados a partir de zero
  126. o index do último elemento de uma coleção com length elementos
  127. é length-1
  128. e, por isso, o index do penúltimo é o index do último -1
  129. ou seja
  130. length-1-1
  131. exemplo uma coleção com 3 elementos
  132. tem o último no index 3-1 = 2
  133. tem o penúltimo no index 3-1-1 = 1
  134. ou seja, para efeitos do Bubble Sort,
  135. haverá q passear de [0 a 1]
  136. */
  137. iPenultimo = pCol.length - 1 - 1,
  138. bFizTrocas = false;
  139.  
  140. iAtual <= iPenultimo;
  141.  
  142. iAtual += 1
  143. ) {
  144. var elementoDoMomento = pCol[iAtual];
  145. var vizinho = pCol[iAtual + 1];
  146. var bDevoTrocar = elementoDoMomento > vizinho;
  147. if (bDevoTrocar) {
  148. //trocar(elementoDoMomento, vizinho); //impossível em JS pq não há passagem por referência
  149. var temp = pCol[iAtual];
  150. pCol[iAtual] = pCol[iAtual+1];
  151. pCol[iAtual+1] = temp;
  152. bFizTrocas = true;
  153. }
  154. }//for
  155. //***depois*** do passeio
  156. if (!bFizTrocas) bOrdenada = true; //concluir q a col ficou ordenada
  157. }//while
  158. }//if bCautela
  159. }//bubbleSort
  160.  
  161. function bs2(
  162. pCol, //a coleção q é para ordenar
  163. pbAscendente //se true, faz asc; c.c. faz desc
  164. )
  165. {
  166. pbAscendente = pbAscendente===undefined ? true : pbAscendente;
  167.  
  168. var iPrimeiro=0, iPenultimo, bOrdenada=false, bFizTrocas=false;
  169. var bCautela = Array.isArray(pCol) && pCol.length>0;
  170. var iTrocas = 0;
  171. var iPasseios = 0;
  172. if (bCautela){
  173. while (!bOrdenada) {
  174. for (
  175. iAtual = iPrimeiro,
  176. iPenultimo = pCol.length - 1 - 1,
  177. bFizTrocas = false;
  178.  
  179. iAtual <= iPenultimo;
  180.  
  181. iAtual += 1
  182. ) {
  183. var elementoDoMomento = pCol[iAtual];
  184. var vizinho = pCol[iAtual + 1];
  185.  
  186. //var bDevoTrocar = elementoDoMomento > vizinho; //ASC
  187. //var bDevoTrocar = elementoDoMomento < vizinho; //DESC
  188. var bDevoTrocar = pbAscendente ?
  189. elementoDoMomento > vizinho
  190. :
  191. elementoDoMomento < vizinho;
  192.  
  193. if (bDevoTrocar) {
  194. //trocar(elementoDoMomento, vizinho); //impossível em JS pq não há passagem por referência
  195. var temp = pCol[iAtual];
  196. pCol[iAtual] = pCol[iAtual+1];
  197. pCol[iAtual+1] = temp;
  198. bFizTrocas = true;
  199. iTrocas++;
  200. }
  201. }//for
  202. //***depois*** do passeio
  203. iPasseios++;
  204. if (!bFizTrocas) bOrdenada = true; //concluir q a col ficou ordenada
  205. }//while
  206. }//if bCautela
  207. return {
  208. "trocas":iTrocas,
  209. "passeios":iPasseios
  210. };
  211. }//bs2
  212.  
  213.  
  214.  
  215. /*
  216. com passagem por referência isto funcionaria (condicional)
  217. não tem em JS
  218. só temos "por valor"
  219. */
  220. function trocar(pA, pB){
  221. var temp = pA;
  222. pA = pB;
  223. pB = temp;
  224. }
  225.  
  226. var col = [30, 20, 10];
  227. document.write ("<br>ANTES de bubble sort:");
  228. document.write(col+"<br>");
  229. bubbleSort(col);
  230. document.write ("<br>DEPOIS de bubble sort:");
  231. document.write(col+"<br>");
  232.  
  233.  
  234. var col2 = ["Zélia", "Maria", "Ana"];
  235. document.write ("<br>ANTES de bubble sort:");
  236. document.write(col2+"<br>");
  237. bubbleSort(col2); //só faz ASC
  238. document.write ("<br>DEPOIS de bubble sort:");
  239. document.write(col2+"<br>");
  240.  
  241. document.write("<hr>");
  242. var col3 = ["Melancias", "Ananazes", "Ameixas", "Kiwis", "Gafanhotos"];
  243. document.write ("<br>ANTES de bs2:");
  244. document.write(col3+"<br>");
  245. bs2(col3 /*, false*/); //só faz DESC
  246. document.write ("<br>DEPOIS de bs2:");
  247. document.write(col3+"<br>");
  248.  
  249. /*
  250. bs2(col3)
  251.  
  252. dentro de bs2 é EFETIVAMENTE representado uma cópia de col3
  253. cópia-de-col3
  254. mas os endereços coincidem
  255. um array é apenas o endereço de uma sequência de elementos colecionados
  256. arrumados em deslocações de memória desde "nenhuma" (index 0) até
  257. length-1
  258. ....
  259.  
  260. Pai Natal
  261. cópia(Pólo Norte, casa do Pai Natal)
  262.  
  263.  
  264. */
  265.  
  266. /*
  267. Escreva, em JS, uma function de nome "bs2" que execute o algoritmo estudado de
  268. "bubble sort" que, recebida uma qualquer coleção e um booleano,
  269. ordena a coleção ascendenentemente se o booleano for true
  270. e descendentemente se for false.
  271. */
  272.  
  273. </script>
  274. </body>
  275. </html>
Advertisement
Add Comment
Please, Sign In to add comment