Advertisement
Guest User

Untitled

a guest
Sep 19th, 2014
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3.  
  4.  
  5. #include <stdio.h>
  6.  
  7. int A = 1009;
  8. int B = 1013;
  9. int M = 1046527;
  10. int X = 0;
  11. int random(int n) {
  12. X = (A * X + B) % M;
  13. return X % n;
  14. }
  15.  
  16. int* Array;
  17. void array_swap(int idx1, int idx2) {
  18. int tmp = Array[idx1];
  19. Array[idx1] = Array[idx2];
  20. Array[idx2] = tmp;
  21. }
  22.  
  23. void partition(int left, int right, int &x, int &y) {
  24. int p = Array[left+random(right-left+1)];
  25. printf("partitioning segment [%i, %i] around %i\n", left+1, right+1, p);
  26. x = left;
  27. y = right;
  28. while (x <= y) {
  29. while (Array[x] < p) x++;
  30. while (Array[y] > p) y--;
  31. if (x <= y) {
  32. array_swap(x, y);
  33. x++;
  34. y--;
  35. }
  36. }
  37. printf("segment [%i, %i] partitioned around %i\n", left+1, right+1, p);
  38. }
  39. void sort(int left, int right) {
  40. printf("sorting segment [%i, %i]\n", left+1, right+1);
  41. if (left == right) goto _exit;
  42. if (left+1 == right) {
  43. if (Array[left] > Array[right]) array_swap(left, right);
  44. goto _exit;
  45. }
  46. int x, y;
  47. partition(left, right, x, y);
  48. if (left <= x) sort(left, x);
  49. if (right >= y) sort(y, right);
  50. _exit:
  51. printf("segment [%i, %i] sorted\n", left+1, right+1);
  52. }
  53.  
  54. void main() {
  55. int n;
  56. scanf("%d", &n);
  57.  
  58. Array = new int[n];
  59. for (int i=0;i<n; i++) scanf("%d", &Array[i]);
  60.  
  61. sort(0, n-1);
  62.  
  63. printf("result: ");
  64. for (int i=0;i<n; i++) printf("%d ", Array[i]);
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement