Before the stats, You must already know what is Merge sort, Selection Sort, Insertion Sort, Bubble Sort, Quick Sort, Arrays, how to get current time.
What is Stable Sorting ?
A sorting algorithm is said to be stable if and only if two records R and S with the same key and with R appearing before S in the original list, R must appear before S in the sorted list.
If you are going to do a multi pass sorting ( On Different attributes ) you must use a stable sorting.
Bubble Sort
Bubble Sort complexity is
Average : О(n2)
Worst : О(n2)
Best : О(n)
void bubbleSort(int* a, int size) { bool swapped = true; int j = 0; int tmp; while (swapped) { swapped = false; j++; for (int i = 0; i < size - j; i++) { if (a[i] > a[i + 1]){ tmp = a[i]; a[i] = a[i + 1]; a[i + 1] = tmp; swapped = true; } } } }
Advantages:
-Easy Implementation
-Stable Sorting Algorithm
-In place sorting algorithm
Disadvantages:
-Complexity of O(N^2)
-The majority of O(N^2) algorithms outperform bubble sort
Selection Sort
Selection Sort Complexity is
Average : О(n2)
Worst : О(n2)
Best : О(n2)
void selectionSort(int* a, int size) { for (int i = 2; i < size; i++) { for (int j = i; j >= 1; j--) { if (a[j] < a[j - 1]) { int temp = a[j - 1]; a[j - 1] = a[j]; a[j] = temp; } } } }
Advantages:
-Easy Implementation
-In Place Sorting Algorithms
Disadvantages:
-Unstable Sorting Algorithm
-Complexity of O(N^2)
-Some O(N^2) sorting algorithms outperform bubble sort
[/tab_element]
[tab_element title=”Insertion Sort”]
Insertion Sort Complexity is
Average : О(n2)
Worst : О(n2)
Best : О(n)
void insertionSort(int* a, int size) { for (int i = 1;i < size;i++) { int x = a[i]; int j = i; while (j > 0 && a[j-1] > a[j]) { int temporaryVariable=a[j]; a[j] = a[j-1]; a[j-1]=temporaryVariable; j --; } a[j] = x; } }
Advantages:
-Easy Implementation
-Stable Sorting Algorithm.
-Outperforms many O(N^2) sorting alogrithms.
-In place sorting algorithm
Disadvantages:
-Complexity of O(N^2)
Merge Sort
Merge Sort complexity is always O(n log(n) ).
void merge(int* a, int first, int middle, int last) { int j,i0,i1; i0 = first; i1 = middle; // While there are elements in the left or right runs for (j = first; j < last; j++) { // If left run head exists and is <= existing right run head. if (i0 < middle && (i1 >= last || a[i0] <= a[i1])){ b[j] = a[i0]; i0++; } else{ b[j] = a[i1]; i1++; } } } void split(int* a, int first, int last) { if (last - first<2) return; int middle = floor((first + last) / 2); //cout<<first<<" "<<middle<<" "<<last<<endl; split(a, first, middle); split(a, middle, last); merge(a, first, middle, last); copyArray(a,b, first, last); }
Advantages:
-Complexity of O(n log(n))
-Stable Sorting Algorithm.
-In-place sorting algorithm
Disadvantages:
-Relatively harder to implement.
-Quick sort usually outperforms merge sort
-Not in place sorting algorithm
Quick Sort
Quick Sort complexity is
Average : О(n log (n))
Worst : О(n2)
Best : О(n log (n))
int partition(int* a, int top, int bottom) { int x = a[top]; int i = top - 1; int j = bottom + 1; int temp; do { do { j--; }while (x >a[j]); do { i++; } while (x <a[i]); if (i < j) { temp = a[i]; a[i] = a[j]; a[j] = temp; } }while (i < j); return j; } void _quickSort(int * a, int top, int bottom) { int middle; if (top < bottom) { middle = partition(a, top, bottom); _quickSort(a, top, middle); // sort first section _quickSort(a, middle+1, bottom); // sort second section } return; } void quickSort(int * a, int size) { _quickSort(a,0,size); return; }
Advantages:
-Complexity of O(n log(n))
-Quick sort is one of the fastest sorting algorithms
Disadvantages:
-Hard to implement.
-Unstable sorting algorithm.
-Not in place sorting algorithm
The algorithm is simple : Populate an array with random integers, try the algorithm, get execution time of the algorithm ( How many milliseconds to complete ), populate another array with random integers, try another algorithm, get execution time, repeat with larger arrays with different algorithms
Code :
#include <iostream> #include <stdlib.h> #include <time.h> #include <ctime> #include <sys/time.h> #include <fstream> #include <math.h> /* * Visit : http://www.titrias.com/ultimate-sorting-algorithms-comparison/ for a complete comparison */ using namespace std; int* b; bool odd; bool enablePrinting=false; struct SortingAlgorithm{ string name; long long time; void (*algorithm)(int*,int); }; //Selection Sort void selectionSort(int* a, int size) { for (int i = 2; i < size; i++) { for (int j = i; j >= 1; j--) { if (a[j] < a[j - 1]) { int temp = a[j - 1]; a[j - 1] = a[j]; a[j] = temp; } } } } ///////////////////////////// //Insertion Sort void insertionSort(int* a, int size) { for (int i = 1;i < size;i++) { int x = a[i]; int j = i; while (j > 0 && a[j-1] > a[j]) { int temporaryVariable=a[j]; a[j] = a[j-1]; a[j-1]=temporaryVariable; j --; } a[j] = x; } } ///////////////////////////// //Merge Sort void merge(int* a, int first, int middle, int last) { int j,i0,i1; i0 = first; i1 = middle; // While there are elements in the left or right runs for (j = first; j < last; j++) { // If left run head exists and is <= existing right run head. if (i0 < middle && (i1 >= last || a[i0] <= a[i1])){ b[j] = a[i0]; i0++; } else{ b[j] = a[i1]; i1++; } } } /////////////////////////////// //Bubble Sort void bubbleSort(int* a, int size) { bool swapped = true; int j = 0; int tmp; while (swapped) { swapped = false; j++; for (int i = 0; i < size - j; i++) { if (a[i] > a[i + 1]){ tmp = a[i]; a[i] = a[i + 1]; a[i + 1] = tmp; swapped = true; } } } } ////////////////////////////////// //Quick Sort int partition(int* a, int top, int bottom) { int x = a[top]; int i = top - 1; int j = bottom + 1; int temp; do { do { j--; }while (x >a[j]); do { i++; } while (x <a[i]); if (i < j) { temp = a[i]; a[i] = a[j]; a[j] = temp; } }while (i < j); return j; } void _quickSort(int * a, int top, int bottom) { int middle; if (top < bottom) { middle = partition(a, top, bottom); _quickSort(a, top, middle); _quickSort(a, middle+1, bottom); } return; } void quickSort(int * a, int size) { _quickSort(a,0,size); return; } /////////////////////////////////////////////////////// void copyArray(int* a,int* b, int first, int last) { for(int k = first; k < last; k++) a[k] = b[k]; } void split(int* a, int first, int last) { if (last - first<2) return; int middle = floor((first + last) / 2); //cout<<first<<" "<<middle<<" "<<last<<endl; split(a, first, middle); split(a, middle, last); merge(a, first, middle, last); copyArray(a,b, first, last); } void mergeSort(int *a, int size){ split(a,0,size); } ///////////////////////////// int* populateArray(int size) { b=new int[size]; int* a = new int[size]; for (int i = 0;i < size;i++) { a[i] = rand() % 50000; b[i]=-1; } return a; } void printArray(int* a,int size) { for (int i = 0;i < size;i++) { if(enablePrinting) cout<<a[i]<<" "; } if(enablePrinting) cout<<endl; } long long now() { //LINUX ONLY. struct timeval timeNow; gettimeofday(&timeNow, NULL); return (timeNow.tv_sec * 1000000 + timeNow.tv_usec); } int diff(timespec end, timespec start) { timespec temp; if ((end.tv_nsec-start.tv_nsec)<0) { temp.tv_sec = end.tv_sec-start.tv_sec-1; temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; } else { temp.tv_sec = end.tv_sec-start.tv_sec; temp.tv_nsec = end.tv_nsec-start.tv_nsec; } return temp.tv_sec; } SortingAlgorithm createSortingAlgorithm(string name,void (* f)(int*,int)){ SortingAlgorithm sortingAlgorithm; sortingAlgorithm.name=name; sortingAlgorithm.algorithm=f; sortingAlgorithm.time=0; return sortingAlgorithm; } int main() { int numberOfAlgorithms=5; SortingAlgorithm* sortingAlgorithms=new SortingAlgorithm[numberOfAlgorithms]; sortingAlgorithms[0]=createSortingAlgorithm("Bubble",&bubbleSort); sortingAlgorithms[1]=createSortingAlgorithm("Selection",&selectionSort); sortingAlgorithms[2]=createSortingAlgorithm("Insertion",&insertionSort); sortingAlgorithms[3]=createSortingAlgorithm("Merge",&mergeSort); sortingAlgorithms[4]=createSortingAlgorithm("Quick",&quickSort); int sizes[10] ={10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000}; long long start, end; ofstream CFile ("comparison.csv"); CFile<<"SIZE;"; for( int k =0 ;k<numberOfAlgorithms;k++){ CFile<<sortingAlgorithms[k].name<<";"; } CFile<<endl; for (int i = 0;i < 10;i++) { srand(rand()); int size = sizes[i]; for (int j = 0;j < 1;j++) { for( int k =0 ;k<numberOfAlgorithms;k++){ int* a = populateArray(size); start = now(); sortingAlgorithms[k].algorithm(a, size); end = now(); sortingAlgorithms[k].time+= end- start; } } CFile<<size<<";"; for( int k =0 ;k<numberOfAlgorithms;k++){ cout << sortingAlgorithms[k].name<<" " << size << " : " << sortingAlgorithms[k].time << endl; CFile<<sortingAlgorithms[k].time<<";"; sortingAlgorithms[k].time=0; } CFile<<endl; } return 0 ; }
N is the number of integers in an unsorted array.
SIZE | Bubble | Selection | Insertion | Merge | Quick |
---|---|---|---|---|---|
10000 | 268337 | 172188 | 112927 | 1354 | 1251 |
20000 | 1153151 | 698674 | 461337 | 3266 | 2167 |
30000 | 2608569 | 1500900 | 1003081 | 5153 | 3622 |
40000 | 4616671 | 2678436 | 1736024 | 7259 | 5162 |
50000 | 7256359 | 4331037 | 2885653 | 8673 | 6439 |
60000 | 10316054 | 5965544 | 4086762 | 13304 | 8664 |
70000 | 14760440 | 8406086 | 5481356 | 13352 | 9916 |
80000 | 18946896 | 10907601 | 6936996 | 13933 | 11119 |
90000 | 24215815 | 13973373 | 9193457 | 16549 | 12253 |
100000 | 30075729 | 17215122 | 11014322 | 18453 | 12940 |
NOTE : If the graphs didn’t show up, Just refresh the page.
0 Comments
Trackbacks/Pingbacks