catalog
- Quick Sorting
-
- Steps
- Implementation
- Heap Sorting
-
- Steps
- Implementation
- Merge Sorting
-
- Steps
- Implementation
Quick Sorting
The worst-case Scenario for quick sorting is O(n2), such as quick sorting of sequential sequences, but its average expected time is O(nlogn).
Steps
- Select an element from the sequence and call it a pivot.
- Reorder the sequence, placing all items smaller than the pivot before the pivot and those larger than the pivot after the pivor. This is called partitioning operation.
- Recursively sort subsequence that is less than the pivot and subsequence that is greater than the pivot.
Implementation
void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j + 1, r); }
Heap Sorting
Max-Heap: The value of each node is greater than or equal to the value of its child node, used in acsending oreder in the heap sort algorithm.
Min-Heap: ~
Steps
- create a heap
- swap the head and the tail of the heap.
- reduce the size of the heap by 1 and call shift_down(0), the purpose is to adjust the top data of the new array to the corresponding position.
- repeat step 2 until the size of the heap is 1.
Implementation
void max_heapify(int arr[], int start, int end) { // create parent node and child node int pa = start; int chd = pa * 2 + 1; while (chd <= end) { if (chd + 1 <= end && arr[chd] < arr[chd + 1]) chd++; if (arr[pa] > arr[chd]) return; else { swap(arr[pa], arr[chd]); pa = chd; chd = pa * 2 + 1; } } } void heap_sort(int a[]) { //initialize, adjust i from the last parent node for (int i = len / 2 - 1: i >= 0; i--) max_heapify(arr, i, len - 1); //swap the first element with the previous element of the sorted element until the sorting is completed. for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); } }
Merge Sorting
2 methods:
- top-down recursion
- buttom-up iteration
Steps
- apply for a space that its size is the sum of two sorted sequences. This size is used to store merged sequence.
- Set two pointers, with the initial positions being the starting positions of two sorted sequences.
- compare the elements pointed to by the two pointers, select the relatively small one and put it in the merge space and move the pointer to the next position.
- repeat step 3 until a pointer reaches the end of the sequence
- copy all remaining elements from another sequence direct to the end of merge sequence.
Implementation
void merge_sort(int arr[], int reg[], int start, int end) { if (start >= end) return; int len = end - start, mid = (len >> 1) + start; int start1 = start, end1 = mid; int start2 = mid + 1, end2 = end; merge_sort(arr, reg, start1, end1); merge_sort(arr, reg, start2, end2); int k = start; while (start1 <= end1 && start2 <= end2) reg[k++] = arr[start1]<arr[start2]?arr[start1++]:arr[start2++]; while (start1 <= end1) reg[k++] = arr[start1++]; while (start2 <= end2) reg[k++] = arr[start2++] for (k = start; k <= end; k++) arr[k] = reg[k]; }