1 / 10

Sorting

Sorting. 9/13/2010. Introduction. In CS1 you covered Insertion Sort, Bubble Sort, and Selection Sort. In these algorithms we end up making a significant number of possible comparisons and swaps between elements. All of these have a worst and average case performance of O(n2).

devlin
Télécharger la présentation

Sorting

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sorting 9/13/2010

  2. Introduction • In CS1 you covered Insertion Sort, Bubble Sort, and Selection Sort. • In these algorithms we end up making a significant number of possible comparisons and swaps between elements. • All of these have a worst and average case performance of O(n2). • Is there a more clever, quicker way to sort numbers that does not require looking at most possible pairs of numbers? • Today we will talk about MergeSort that uses recursion and a clever idea in sorting two separately sorted arrays.

  3. The Merge • The merging of two sorted lists is a tool we can use in Merge Sort. • Say you are given 2 arrays, each of which is already sorted. • Now your job is to efficiently combine the 2 arrays into 1 larger one which contains all of the values of the 2 smaller arrays in sorted order.

  4. The Merge • The essential idea is this: Array 1: Array 2: Merged: • Keep track of the smallest value in each array that hasn’t been placed in order in the larger array yet. • Compare these two smallest values from each array. Place the smallest of the two values in the next location in the larger array. • Adjust the smallest value for the appropriate array. • Continue this process until all values have been placed in the large array. • What does this remind you of? We talked about an algorithm that combines 2 sorted lists of names… • Sorted List Matching Problem

  5. Example on the Board • Complete last example of merge on the board.

  6. Fill out Merge Method on the Board public static int[] Merge(int[] first, int[] second) { inttotallength = first.length + second.length; int[] answer = new int[totallength]; intfirstCtr = 0; intsecondCtr = 0; for (inti=0; i<answer.length; i++) { // Decide to take next smallest number from 1st array OR 2nd if ((secondCtr == second.length) || ((firstCtr < first.length) && (first[firstCtr] < second[secondCtr]))) { answer[i] = first[firstCtr]; firstCtr ++; } else { answer[i] = second[secondCtr]; secondCtr ++; } } return answer; }

  7. Merge Sort • How can we use the Merge to sort an entire array, since we were merging special arrays where the first and second halves were already sorted? • The main idea: • Sort the first half of the array, using merge sort. • Sort the second half of the array, using merge sort. • Now, we do have a situation to use the Merge algorithm. Simply merge the first half of the array with the second half. • So all of the actual sorting gets done in the Merge method. • Let’s do an example to demonstrate this.

  8. Merge Sort MergeSort(int[] numbers){ if(numbers.length > 1){ firstHalf = MergeSort(firstHalf); secondHalf = MergeSort(secondHalf); numbers=Merge(firstHalf, secondHalf); } return numbers; } Merge Merge Merge

  9. Merge Sort Code public static int[] MergeSort(int[] numbers){ if (numbers.length > 1) { // Create an array to copy the 1st half of the values int[] firsthalf = new int[numbers.length/2]; for (inti=0;i<firsthalf.length;i++) firsthalf[i] = numbers[i]; // Create an array to copy the 2nd half of the values int[] secondhalf = new int[numbers.length - firsthalf.length]; for (inti=0;i<secondhalf.length;i++) secondhalf[i] = numbers[firsthalf.length + i]; // Recursively call MergeSort on the 1st half, then the 2nd half, then merge firsthalf = MergeSort(firsthalf); secondhalf = MergeSort(secondhalf); numbers = Merge(firsthalf,secondhalf); } return numbers; }

  10. Merge Sort Analysis • Shown on the board

More Related