150 likes | 316 Views
Sorting. A fundamental operation in computer science (many programs need to sort as an intermediate step). Many sorting algorithms have been developed Choose a criteria which is used to order data
E N D
Sorting • A fundamental operation in computer science (many programs need to sort as an intermediate step). • Many sorting algorithms have been developed • Choose a criteria which is used to order data • Given a list of records that have keys, use those keys to define an ordering of the items in the list • To sort a set of data, the data have to be compared and moved as necessary. Thus, measure the efficiency of a sorting algorithm by: • Number of data comparisons it needs to perform • Number of data movements it needs to perform
Elementary Sorting Algorithms • given n items to sort • There are a number of simple sorting algorithms whose worst and average case time complexity is quadratic (i.e., O(n2)) • Insertion sort • Selection sort • Bubble sort
Insertion Sort • Given an array of data items: • The insertion sort algorithm views the array as having a sorted side and an unsorted side • The sorted side starts with the first element, which is not necessarily the smallest element • The sorted side grows by taking the front element from the unsorted side and inserting it in the place that keeps the sorted side arranged from small to large • In some cases there is no need to move the new inserted item
The Insertion Sort Algorithm template <class T> void insertionsort(T data[], int n){ for(int i=1, j; i<n; i++){ T tmp =data[i]; //take next key from unsorted part of array for (j =i; j>0 && tmp < data[j-1]; j--) //shift data down to make room for inserting tmp if necessary data[j] = data[j-1]; data[j] = tmp; //insert in appropriate location in sorted part of array } }
Complexity of Insertion Sort • Best case O(n) • Worst and average case O(n2)
Selection Sort • Basic idea: • Repeatedly select the smallest element and move this element to the front of the unsorted side
selectionsort template<class T> void selectionsort(T data[], int n) { int j; for (int i = 0, least, j; i < n-1; i++) { //find the index of the smallest element in the unsorted part of array for (j = i+1, least = i; j < n; j++) if (data[j] < data[least]) least = j; //put the ith smallest to the i-1th position swap(data[least],data[i]); } }
Selection Sort (cont’d) • Given an array of integers: • Start by finding the smallest element • Swap the smallest entry with the first element • Part of the array is sorted • Find the smallest element in the unsorted side • Swap with the front of the unsorted side • The size of the sorted side is increased by one element • Continue until the unsorted side has just one number.
selectionsort • complexity
BubbleSort • Given an array of integers: • Scan the array from right to left • Look at pairs of elements (adjacent elements) in the array and swap their order if needed (i.e., if the left element is larger than the right element) • Repeatedly scan the array from right to left looking at pairs of elements and swapping their order if needed • In this way, the smallest element is “bubbled” all the way to the first position of the array • Scan the array again from right to left to “bubble” the second smallest element to the second of the array • Continue scanning until done
bubblesort template<class T> void bubblesort(T data[], int n) { // n passes, each pass ”bubble” one element for (int i = 0; i < n-1; i++) //keep comparing adjacent elements for (int j = n-1; j > i; --j) if (data[j] < data[j-1]) swap(data[j],data[j-1]); }
BubbleSort • complexity
Elementary Sorting Algorithms • Selection Sort, Insertion Sort, and Bubble Sort all have a worst-case time of O(n2), making them impractical for large arrays • But they are easy to program, easy to debug • Insertion Sort also has good performance when the array is nearly sorted to begin with • But more sophisticated algorithms are needed when good performance is needed in all cases for large arrays • Heap Sort • Quick Sort • Merge Sort