Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using System.Collections.Concurrent;
  5. using System.Threading;
  6.  
  7. namespace BucketSort
  8. {
  9. public class BucketSort
  10. {
  11. static SpinLock sp = new SpinLock();
  12. public static void Bucketear(int[] vec)
  13. {
  14. //verificar se o vetor contém valores.
  15. if (vec == null || vec.Length == 0)
  16. return;
  17.  
  18. //variáveis para guardar o maior e o menor valor do vetor,
  19. //serão inicializadas com a primeira posição do vetor.
  20. int max = vec[0];
  21. int min = vec[0];
  22.  
  23. //aqui nosso loop irá percorrer o vetor iniciando da posição 1.
  24. //ao final do percurso as variáveis max e min terão o maior e o menor valor
  25. //do vetor, respectivamente.
  26. for (int i = 1; i < vec.Length; i++)
  27. {
  28. if (vec[i] > max)
  29. max = vec[i];
  30. if (vec[i] < min)
  31. min = vec[i];
  32. }
  33.  
  34.  
  35. //aqui é criado um balde para guardar todos os valores do vetor.
  36. //Cada valor será guardado em seu índice menos o menor valor.
  37. //Por exemplo: 15 será guardado na posição 15 menos o menor valor,
  38. //se min == 0, 15 será guardado na posição 15.
  39. List<int>[] buckets = new List<int>[max - min + 1];
  40.  
  41.  
  42. //aqui será inicializado o balde, criando uma nova List<int> para cada valor
  43. //igual do vetor.
  44.  
  45. Parallel.For<int[]>(0, vec.Length, () => new int[max - min + 1], (i, loop, lista) =>
  46. {
  47. if (buckets[vec[i] - min] == null)
  48. {
  49. buckets[vec[i] - min] = new List<int>();
  50. lista[vec[i] - min] = vec[i];
  51. }
  52. return lista;
  53. }, (x) =>
  54. {
  55. if (x != null)
  56. {
  57. bool l = false;
  58. sp.Enter(ref l);
  59. for (int i = 0; i < x.Length; i++)
  60. {
  61. buckets[i].Add(x[i]);
  62. }
  63. sp.Exit(false);
  64. }
  65. });
  66.  
  67. //Parallel.For(0, holder.Length, i =>
  68. //{
  69. // holder[i] = new List<int>();
  70. //});
  71. //for (int i = 0; i < vec.Length; i++)
  72. //{
  73. // buckets[vec[i] - min].Add(vec[i]);
  74. //}
  75.  
  76.  
  77. //variável criada para armazenar o índice original do vetor
  78. int k = 0;
  79.  
  80.  
  81. //aqui os valores serão movidos do balde para o vetor em posição ordenada.
  82. for (int i = 0; i < buckets.Length; i++)
  83. {
  84. if (buckets[i].Count > 0)
  85. {
  86. for (int j = 0; j < buckets[i].Count; j++)
  87. {
  88. vec[k] = buckets[i][j];
  89. k++;
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement