sorting.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/time.h>
  5. #define TIME 1000000ll
  6. long long GetUSecTime(){
  7. struct timeval tv;
  8. gettimeofday(&tv, NULL);
  9. return (long long)tv.tv_sec*TIME+tv.tv_usec;
  10. }
  11. void lRead(FILE* in,int* array){
  12. int current;
  13. int i=0;
  14. while(fscanf(in,"%d",&current) != EOF){
  15. array[i] = (int)current;
  16. i++;
  17. }
  18. }
  19. void q_sort(int*,int,int);
  20. int q_part(int*,int,int);
  21. int* i_sort(int*, int);
  22. int* b_sort(int*,int);
  23. int *m_sort(int *, int, int);
  24. void quicksort(int*, int);
  25. int *heapsort(int* ,int);
  26. void heapify(int* ,int);
  27. void bubbleDown(int* ,int, int);
  28. void bubbleUp(int* , int);
  29. int main(int argc, char* argv[]){
  30. if(argc < 2){
  31. printf("-q Quicksort\n");
  32. printf("-b Bubblesort\n");
  33. printf("-i Insertsort\n");
  34. printf("-h Heapsort\n");
  35. printf("-F File length\n");
  36. exit(EXIT_FAILURE);
  37. }
  38. if(argv[1] = '-F'){
  39. FILE* in = fopen(argv[2],"r");
  40. int size = atoi(argv[3]);
  41. int* unsorted = malloc(sizeof(int) * size);
  42. lRead(in,unsorted); //Datei in Txt einlesen
  43. long long time1, time2;
  44. if(argv[4] = '-i'){ //Insertsort
  45. printf("Insertsort: \n");
  46. time1 = GetUSecTime();
  47. unsorted = i_sort(unsorted,size); // funktioniert vollstaendig
  48. time2 = GetUSecTime();
  49. printf("Elapsed time: %lld usec \n", time2-time1);
  50. }else if(argv[4] = '-b'){ //Bubblesort
  51. printf("Bubblesort: \n");
  52. time1 = GetUSecTime();
  53. unsorted = b_sort(unsorted,size);
  54. time2 = GetUSecTime();
  55. printf("Elapsed time: %lld usec \n", time2-time1);
  56. }else if(argv[4] = '-q'){//Quicksort
  57. printf("Quicksort: \n");
  58. time1 = GetUSecTime();
  59. q_sort(unsorted,0,size); // funktioniert vollstaendig
  60. time2 = GetUSecTime();
  61. printf("Elapsed time: %lld usec \n", time2-time1);
  62. }else if(argv[4] = '-h'){//Heapsort
  63. printf("Heapsort: \n");
  64. time1 = GetUSecTime();
  65. unsorted = heapsort(unsorted,size);
  66. time2 = GetUSecTime();
  67. printf("Elapsed time: %lld usec \n", time2-time1);
  68. }
  69. fclose(in);
  70. //for(int i = 0; i < size; i++){
  71. // printf("%d \n",unsorted[i]);
  72. //}
  73. }else{
  74. printf("./a.out -F <filename> <numberofelements> <sortingmethod>");
  75. exit(EXIT_FAILURE);
  76. }
  77. }
  78. void heapify(int *array,int end){
  79. int last;
  80. if((end-1)%2 != 0){
  81. last = (end - 1)/2+1;
  82. }
  83. else {
  84. last = (end - 1) / 2;
  85. }
  86. printf("last: %d\n",last);
  87. for(int i = last; i > -1; i--){
  88. bubbleDown(array,i,end);
  89. }
  90. }
  91. int *heapsort(int *array,int length){
  92. int last = length-1;
  93. heapify(array,length);
  94. for(int i = last; i > 0; i--){
  95. int tmp = array[0];
  96. array[0] = array[i];
  97. array[i] = tmp;
  98. bubbleDown(array,0,i);
  99. }
  100. return array;
  101. }
  102. void bubbleDown(int *array,int node, int end){
  103. int lci = 2*node+1;
  104. if(lci < end){
  105. int gci = lci;
  106. int rci = lci + 1;
  107. if(rci < end){
  108. if(array[rci] > array[lci]){
  109. gci = rci;
  110. }
  111. }
  112. if(array[gci] > array[node]){
  113. int tmp = array[node];
  114. array[node] = array[gci];
  115. array[gci] = tmp;
  116. bubbleDown(array,gci,end);
  117. }
  118. }
  119. }
  120. void bubbleUp(int *array, int current){
  121. if(current == 0){
  122. return;
  123. }
  124. int parent = (current-1)/2;
  125. if(array[current] > array[parent]){
  126. int tmp = array[current];
  127. array[current] = array[parent];
  128. array[parent] = tmp;
  129. bubbleUp(array,parent);
  130. }
  131. }
  132. void quicksort(int *A, int len) {
  133. if (len < 2) return;
  134. int pivot = A[len / 2];
  135. int i, j;
  136. for (i = 0, j = len - 1; ; i++, j--) {
  137. while (A[i] < pivot) i++;
  138. while (A[j] > pivot) j--;
  139. if (i >= j) break;
  140. int temp = A[i];
  141. A[i] = A[j];
  142. A[j] = temp;
  143. }
  144. quicksort(A, i);
  145. quicksort(A + i, len - i);
  146. }
  147. int q_part(int *array, int low, int high){
  148. int pivotindex = (low + high)/2;
  149. int pivotvalue = array[pivotindex];
  150. int tmp = array[high];
  151. array[high] = array[pivotindex];
  152. array[pivotindex] = tmp;
  153. int sp = low;
  154. for(int su = low; su < high; su++){
  155. if(array[su] < pivotvalue){
  156. tmp = array[sp];
  157. array[sp] = array[su];
  158. array[sp] = tmp;
  159. sp++;
  160. }
  161. }
  162. int tmp2 = array[sp];
  163. array[sp] = array[high];
  164. array[high] = tmp2;
  165. return sp;
  166. }
  167. void q_sort(int *array, int low, int high){
  168. if(low < high){
  169. int pivotindex = q_part(array,low,high);
  170. q_sort(array, low, pivotindex-1);
  171. q_sort(array, pivotindex+1, high);
  172. }
  173. }
  174. // Bubblesort
  175. int* b_sort(int *array,int size){
  176. int end = 1;
  177. while(end != 0){
  178. end = 0;
  179. for(int i = 0; i < size; i++){
  180. if(array[i] > array[i+1]){
  181. int tmp = array[i];
  182. array[i] = array[i+1];
  183. array[i+1] = tmp;
  184. end = 1;
  185. }
  186. }
  187. size--;
  188. }
  189. return array;
  190. }
  191. // Insert sort
  192. int* i_sort(int *array, int n) {
  193. for(int i = 1; i < n; ++i) {
  194. int tmp = array[i];
  195. int j = i;
  196. while(j > 0 && tmp < array[j - 1]) {
  197. array[j] = array[j - 1];
  198. --j;
  199. }
  200. array[j] = tmp;
  201. }
  202. return array;
  203. }
  204. // Merge sort
  205. int* m_sort(int *array, int l, int r){
  206. //if(size == 1){
  207. if(l < r){
  208. int mid = (l + r)/2;
  209. int *arr1 = malloc(sizeof(int) * 5); //first part
  210. printf("zweiter teil: \n");
  211. int *arr2 = malloc(sizeof(int) * 5); //second part
  212. for(int i = l; i < r; i++){
  213. printf("%d\n",array[i]);
  214. }
  215. arr1 = m_sort(array,l,mid);
  216. arr2 = m_sort(array,mid+1,r);
  217. int e1,e2;
  218. for(int i = l; i < r; i++){
  219. if(e1 >= r){
  220. array[i] = arr2[e2];
  221. e2++;
  222. }
  223. else if(e2 >= r){
  224. array[i] = arr1[e1];
  225. e1++;
  226. }
  227. else if(arr1[e1] <= arr2[e2]){
  228. array[i] = arr1[e1];
  229. e1++;
  230. }
  231. else{
  232. array[i] = arr2[e2];
  233. e2++;
  234. }
  235. }
  236. }
  237. }