fork download
  1. #include <stdio.h>
  2.  
  3. char *input_argv[] = { "prog.c", "12", "10", "17", "1", "22" }; // al posto di argv[]
  4. int input_argc = sizeof (input_argv) / sizeof (input_argv[0]); // al posto di argc
  5.  
  6. int
  7. part (int lista[], int a, int z)
  8. {
  9. // Viene preparata una variabile per lo scambio di
  10. // valori.
  11.  
  12. int scambio = 0;
  13.  
  14. // Si assume che «a» sia inferiore a «z».
  15.  
  16. int i = a + 1;
  17. int cf = z;
  18.  
  19. // Inizia il ciclo di scansione dell'array.
  20.  
  21. while (1)
  22. {
  23. while (1)
  24. {
  25. // Sposta «i» a destra.
  26.  
  27. if ((lista[i] > lista[a]) || (i >= cf))
  28. {
  29. break;
  30. }
  31. else
  32. {
  33. i += 1;
  34. }
  35. }
  36. while (1)
  37. {
  38. // Sposta «cf» a sinistra.
  39.  
  40. if (lista[cf] <= lista[a])
  41. {
  42. break;
  43. }
  44. else
  45. {
  46. cf -= 1;
  47. }
  48. }
  49. if (cf <= i)
  50. {
  51. // È avvenuto l'incontro tra «i» e «cf».
  52.  
  53. break;
  54. }
  55. else
  56. {
  57. // Vengono scambiati i valori.
  58.  
  59. scambio = lista[cf];
  60. lista[cf] = lista[i];
  61. lista[i] = scambio;
  62.  
  63. i += 1;
  64. cf -= 1;
  65. }
  66. }
  67.  
  68. // A questo punto lista[a..z] è stata ripartita e «cf» è
  69. // la collocazione di «lista[a]».
  70.  
  71. scambio = lista[cf];
  72. lista[cf] = lista[a];
  73. lista[a] = scambio;
  74.  
  75. // A questo punto, lista[cf] è un elemento (un valore)
  76. // nella giusta posizione.
  77.  
  78. return cf;
  79. }
  80.  
  81. void
  82. quicksort (int lista[], int a, int z)
  83. {
  84. // Viene preparata la variabile «cf».
  85.  
  86. int (cf) = 0;
  87.  
  88. if (z > a)
  89. {
  90. cf = part (lista, a, z);
  91. quicksort (lista, a, cf-1);
  92. quicksort (lista, cf+1, z);
  93. }
  94. }
  95.  
  96. int
  97. main (int argc, char *argv[])
  98. {
  99. int lista[input_argc - 1];
  100. int i;
  101.  
  102. // Considera gli argomenti come gli elementi
  103. // dell'array da ordinare.
  104.  
  105. for (i = 1; i < input_argc; i++)
  106. {
  107. sscanf (input_argv[i], "%i", &lista[i-1]);
  108. }
  109.  
  110. // Esegue il riordino.
  111.  
  112. quicksort (lista, 0, input_argc-2);
  113.  
  114. // Emette il risultato.
  115.  
  116. for (i = 0; i < (input_argc-1); i++)
  117. {
  118. printf ("%i ", lista[i]);
  119. }
  120. printf ("\n");
  121.  
  122. return 0;
  123. }
Success #stdin #stdout 0.02s 1720KB
stdin
Standard input is empty
stdout
1 10 12 17 22