Pancake sort:
Pancake sorting is the colloquial term for the mathematical problem of sorting a disordered stack of pancakes in order of size when a spatula can be inserted at any point in the stack and used to flip all pancakes above it.
A pancake number is the maximum number of flips required for a given number of pancakes.
flip(array, i): Reverse array from 0 to i.
Pseudo code Pancake sort:
1) iMax = Index of Largest element in unsorted array.
Find index of the maximum element index in arr[0..unsorted_array_size -1].
2) Call flip(array, iMax)
It will flip all element of array from 0 to iMax index.
The largest element will be the first element in the array.
3) Call flip(array, unsorted_array_size -1)
Flip complete unsorted array which result to put the largest element at the end of the unsorted array.
Complexity :
Total O(n) flip operations are performed in where each flip will take O(n) time. Therefore complexity is O(n^2).
Example
19 | 23 | 6 | 15 | 45 | 30 | 14 |
1. Find Max element index from 0 to N-1
iMax = 4
19 | 23 | 6 | 15 | 45 | 30 | 14 |
2. flip(0,iMax)
45 | 15 | 6 | 23 | 19 | 30 | 14 |
3. flip(0,N-1)
14 | 30 | 19 | 23 | 6 | 15 | 45 |
Repeat Step #1 to Step #3:
1. Find Max element index from 0 to N-2
iMax = 1
14 | 30 | 19 | 23 | 6 | 15 | 45 |
2. flip(0,iMax)
30 | 14 | 19 | 23 | 6 | 15 | 45 |
3. flip(0,N-2)
15 | 6 | 23 | 19 | 14 | 30 | 45 |
class PancakeSort {
/**Perform Pancake sort. */
static intpancakeSort(int array[]) {
int n = array.length;
/** */
for (intunsortASize=n; unsortASize>1;--unsortASize) {
/**
* Find index of the maximum element
* in arr[0.. unsortArrSize-1]
* */
int idxMax = findMax(array,unsortASize);
/**
* Move the maximum element to end of current
* array if it's not already at the end*
*/
if (idxMax != unsortASize-1) {
/**flip will put the max element to beginning.*/
flip(array, idxMax);
/**
* flip will put the max element in the last
* of unsorted array.
**/
flip(array, unsortASize-1);
}
}
return 0;
}
/**
* Returns index of maximum element in unsorted array.
**/
static intfindMax(int array[], int n) {
int idxMax = 0;
for (inti = 0; i < n; ++i) {
if (array[i] > array[idxMax]) {
idxMax = i;
}
}
return idxMax;
}
/**
* Reverses array[0..idx].
**/
static voidflip(int array[], int idx) {
int temp, start = 0;
while (start < idx) {
temp = array[start];
array[start] = array[idx];
array[idx] = temp;
start++;
idx--;
}
}
/** Utility function: print array*/
static voidprintArray(int arr[]) {
StringBuilder sb = newStringBuilder();
for (intelement : arr) {
sb.append(element).append(" ");
}
System.out.println(sb.toString());
}
/** Test Pancake sort. */
public static void main (String[] args) {
int array[] = {23, 10, 20, 11, 12, 6, 7};
System.out.println("Unsorted Array: ");
printArray(array);
PancakeSort.pancakeSort(array);
System.out.println("Sorted Array: ");
printArray(array);
}
}
Output:
Unsorted Array:
23 10 20 11 12 6 7
Sorted Array:
6 7 10 11 12 20 23
No comments:
Post a Comment