fork(3) download
  1. #include <iostream>
  2. #include <cstring>
  3. #define MAX_LEN 25
  4.  
  5. void str_swap(char* a, char* b);
  6. void heapify(char arr[][MAX_LEN], int rows, int i, bool (*cmp)(const char*, const char*)) ;
  7. void hsort(char arr[][MAX_LEN], int rows, bool (*cmp)(const char*, const char*));
  8.  
  9. bool compare(const char* a, const char* b){
  10. return (std::strcmp(a, b) > 0);
  11. }
  12.  
  13.  
  14. int main(void){
  15. int rows = 7;
  16. char arr[32][MAX_LEN] = {
  17. { "vlad" },
  18. { "kostya" },
  19. { "anya" },
  20. { "vasy" },
  21. { "boris" },
  22. { "sveta" },
  23. { "vity" },
  24. };
  25.  
  26. hsort(arr, rows, compare);
  27.  
  28. for(int i = 0; i < rows; ++i)
  29. std::cout << arr[i] << std::endl;
  30. return 0;
  31. }
  32.  
  33.  
  34. void heapify(char arr[][MAX_LEN], int rows, int i, bool (*cmp)(const char*, const char*)) {
  35. int li, ri, big;
  36. while(1) {
  37. li = i*2 + 1;
  38. ri = li + 1;
  39.  
  40. if((li < rows) && (*cmp)(arr[li], arr[i]))
  41. big = li;
  42. else
  43. big = i;
  44.  
  45. if((ri < rows) && (*cmp)(arr[ri], arr[big]))
  46. big = ri;
  47.  
  48. if(big != i) {
  49. str_swap(arr[big], arr[i]);
  50. i = big;
  51. } else
  52. break;
  53. }
  54. }
  55.  
  56. //пирамидальная сортировка
  57. void hsort(char arr[][MAX_LEN], int rows, bool (*cmp)(const char*, const char*)){
  58. for(int i = rows / 2; i >= 0; --i)
  59. heapify(arr, rows, i, cmp);
  60.  
  61. for(int j = rows - 1; j >= 0; --j){
  62. str_swap(arr[0], arr[j]);
  63. heapify(arr, j, 0, cmp);
  64. }
  65. }
  66.  
  67.  
  68. void str_swap(char* a, char* b){
  69. char t[MAX_LEN];
  70. std::strcpy(t, a);
  71. std::strcpy(a, b);
  72. std::strcpy(b, t);
  73. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
anya
boris
kostya
sveta
vasy
vity
vlad