Well, I needed a sorting algorithm in C++, so I decided to write my own. Merge sort is quick, O(nlogn), and stable. Recursion is also slow so I decided to write it without recursion:
// array to be sorted int array[] = {12,4,10,2,3,2,8,7,-1,-4,14,8,9,2,11}; unsigned int len = 15; // allocate memory for temporarly saved values std::vectortempValues; tempValues.resize(len); // start sorting 2 elements each time, then merge them with the two next to them etc for(int step=2; step/2 < len; step*=2) { for(unsigned int i=0; i < len; i+=step) { int endOfT2 = i+step; if(i+ step/2 >= len) { continue; } else if (i+step >= len) { endOfT2 = len; } // both sets have step/2 items. // t1 points to the first set of values int t1 = i; // t2 points to the second set of values int t2 = i+step/2; // here we save all the values that have been overridden from the first set unsigned int tempIndex=0; while(t1 < i+step/2 && t2 < endOfT2) { if(array[t1]>array[t2]) { tempValues[tempIndex]=array[t1]; t1++; } else { tempValues[tempIndex]=array[t2]; t2++; } tempIndex++; } while(t1 < i+step/2) { tempValues[tempIndex]=array[t1]; t1++; tempIndex++; } // write values back to the array for(unsigned int t=0; t < tempIndex; ++t) { array[i+t]=tempValues[t]; } } } // print the sorted array for(unsigned int i=0; i < len; ++i) { std::cout << " " << array[i]; } std::cout << "\n";
No comments:
Post a Comment