Given an an unsorted array, sort the given array. You are allowed to do only following operation on array.
flip(arr, i): Reverse array from 0 to i
http://en.wikipedia.org/wiki/Pancake_sortingUnlike a traditional sorting algorithm, which attempts to sort with the fewest comparisons possible, the goal is to sort the sequence in as few reversals as possible.
The goal is to sort the sequence in as few reversals as possible. A variant of the problem is concerned with burnt pancakes, where each pancake has a burnt side and all pancakes must, in addition, end up with the burnt side on bottom.
1) Start from current size equal to n and reduce current size by one while it’s greater than 1. Let the current size be curr_size. Do following for every curr_size
……a) Find index of the maximum element in arr[0..curr_szie-1]. Let the index be ‘mi’
……b) Call flip(arr, mi)
……c) Call flip(arr, curr_size-1)
/* Returns index of the maximum element in arr[0..n-1] */
int
findMax(
int
arr[],
int
n)
{
int
mi, i;
for
(mi = 0, i = 0; i < n; ++i)
if
(arr[i] > arr[mi])
mi = i;
return
mi;
}
int
pancakeSort(
int
*arr,
int
n)
{
// Start from the complete array and one by one reduce current size by one
for
(
int
curr_size = n; curr_size > 1; --curr_size)
{
// Find index of the maximum element in arr[0..curr_size-1]
int
mi = findMax(arr, curr_size);
// Move the maximum element to end of current array if it's not
// already at the end
if
(mi != curr_size-1)
{
// To move at the end, first move maximum number to beginning
flip(arr, mi);
// Now move the maximum number to end by reversing current array
flip(arr, curr_size-1);
}
}
}
/* Reverses arr[0..i] */
void
flip(
int
arr[],
int
i)
{
int
temp, start = 0;
while
(start < i)
{
temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
start++;
i--;
}
}
http://rosettacode.org/wiki/Sorting_algorithms/Pancake_sort#Java
Read full article from Pancake sorting | GeeksforGeeks