Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. //быстрая сортировка с объяснением - DONE
  2. //если предыдущая часть программы не нужна - можно стереть, натравив алгоритм на любой рандомный массив
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. void qs(int* s_arr, int first, int last)
  8. {
  9. int i = first, j = last, x = s_arr[(first + last) / 2]; //выделяем начало, конец, середину
  10. do { //теперь нам надо чтобы меньшие середины значения были левее, большие - правее
  11. while (s_arr[i] < x) i++; //находим первый эл-т слева > середины
  12. while (s_arr[j] > x) j--; //и аналогично первый справа, < середины
  13.  
  14. if(i <= j) { //и если они не на своих местах - меняем местами
  15. if (s_arr[i] > s_arr[j])
  16. {
  17. int sw = s_arr[i];
  18. s_arr[i] = s_arr[j];
  19. s_arr[j] = sw;
  20. }
  21. i++;
  22. j--;
  23. }
  24. } while (i <= j);//в итоге получили массив, где в левой части значения меньше середины
  25. //а справа - больше
  26.  
  27. if (i < last)
  28. qs(s_arr, i, last);//повторяем для левой половины
  29. if (first < j)
  30. qs(s_arr, first, j);//повторяем для правой половины
  31. }
  32.  
  33. int main()
  34. {
  35. int length = 0;
  36. printf("Input the length of first array\n");
  37. scanf("%d", &length);
  38. const int length1 = length;
  39. int arr1[length1];
  40. int i;
  41. for (i = 0; i < length1; i++)
  42. {
  43. printf("Input next element of first array\n");
  44. scanf("%d", &arr1[i]);
  45. }
  46.  
  47. printf("\nInput the length of second array\n");
  48. scanf("%d", &length);
  49. const int length2 = length;
  50. int arr2[length2];
  51. for (i = 0; i < length2; i++)
  52. {
  53. printf("Input next element of second array\n");
  54. scanf("%d", &arr2[i]);
  55. }
  56.  
  57. printf("First array: ");
  58. for (i = 0; i < length1; i++) printf("%d ", arr1[i]);
  59. printf("\nSecond array: ");
  60. for (i = 0; i < length2; i++) printf("%d ", arr2[i]);
  61.  
  62. const length3 = length1 + length2;
  63. int arr3[length3];
  64. int i1 = 0; int i2 = 0; int i3 = 0;
  65. while (i1 < length1 && i2 < length2)
  66. {
  67. if (arr1[i1] < arr2[i2])
  68. {
  69. arr3[i3] = arr1[i1];
  70. i1++;
  71. }
  72. else
  73. {
  74. arr3[i3] = arr2[i2];
  75. i2++;
  76. }
  77. i3++;
  78. }
  79.  
  80. while (i1 < length1)
  81. {
  82. arr3[i3] = arr1[i1];
  83. i1++;
  84. i3++;
  85. }
  86.  
  87. while (i2 < length2)
  88. {
  89. arr3[i3] = arr2[i2];
  90. i2++;
  91. i3++;
  92. }
  93.  
  94. printf("\nMerged array: ");
  95. for (i = 0; i < length3; i++) printf("%d ", arr3[i]);
  96.  
  97. qs(arr3, 0, length3-1);
  98. printf("\nQuicksorted array (but it was already sorted before): ");
  99. for (i = 0; i < length3; i++) printf("%d ", arr3[i]);
  100. return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement