fork download
  1. #include <stdio.h>
  2. #include <stddef.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5. #include <string.h>
  6.  
  7. int cmp_int(void *a)
  8. {
  9. return ( ((int *)a)[0] > ((int *)a)[1] );
  10. }
  11.  
  12. int cmp_float(void *a)
  13. {
  14. return ( ((float *)a)[0] > ((float *)a)[1] );
  15. }
  16.  
  17.  
  18.  
  19.  
  20. void bubble(void *arr, size_t elSize, size_t arSize, int(*cmp)(void *))
  21. {
  22. char swapped;
  23. void *i = arr;
  24. void *yoba = ((char *)arr) + arSize - elSize; // vot tak
  25. void *tmp = alloca(elSize);
  26. //printf("\n\n----\narSize: %i \n----\n\n", arSize/elSize);
  27. do
  28. {
  29. swapped = 0;
  30. for (i = arr; i != yoba ; i = ((char *)i) + elSize )
  31. {
  32. if( cmp( i ))
  33. {
  34. memcpy(tmp , i , elSize); // kopiruem vo vremennuiu pamyat
  35. memcpy(i , ((char *)i) + elSize, elSize); // sledujushee v predidushee
  36. memcpy( ((char *)i) + elSize, tmp , elSize); // iz vremennoy v sledujushee
  37. swapped = 1;
  38. }
  39. }
  40.  
  41. } while (swapped != 0);
  42. }
  43.  
  44. int main(int argc, char *argv[])
  45. {
  46. int a[] = {9, 8, 5, -4, 5, 1, -3, 0};
  47. float b[] = {0.16, -2745, 666.6666666, 14.88, 133.7, 267.234, 123.123, 0};
  48. int i;
  49.  
  50. for(i = 0; i < 8; i++)
  51. {
  52. printf("%i, ", a[i]);
  53. }
  54. printf("\n");
  55.  
  56. bubble((void*)a, sizeof(int), sizeof(a), cmp_int);
  57.  
  58. for(i = 0; i < 8; i++)
  59. {
  60. printf("%i, ", a[i]);
  61. }
  62. printf("\n-*-*-*-*-*-*-*-\n");
  63. /////////////////////////////////////////////////////////////////////////////////////
  64.  
  65. for(i = 0; i < 8; i++)
  66. {
  67. printf("%f, ", b[i]);
  68. }
  69. printf("\n");
  70.  
  71. bubble((void*)b, sizeof(float), sizeof(b), cmp_float);
  72.  
  73. for(i = 0; i < 8; i++)
  74. {
  75. printf("%f, ", b[i]);
  76. }
  77.  
  78.  
  79.  
  80. return 0;
  81. }
Success #stdin #stdout 0s 1832KB
stdin
Standard input is empty
stdout
9, 8, 5, -4, 5, 1, -3, 0, 
-4, -3, 0, 1, 5, 5, 8, 9, 
-*-*-*-*-*-*-*-
0.160000, -2745.000000, 666.666687, 14.880000, 133.699997, 267.234009, 123.123001, 0.000000, 
-2745.000000, 0.000000, 0.160000, 14.880000, 123.123001, 133.699997, 267.234009, 666.666687,