Given 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
C
/* C program for Pancake Sorting */ #include <stdio.h> #include <stdlib.h> /* 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--;
}
} /* 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;
} // The main function that sorts given array using flip // operations 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);
}
}
} /* A utility function to print an array of size n */ void printArray( int arr[], int n)
{ for ( int i = 0; i < n; ++i)
printf ( "%d " , arr[i]);
} // Driver program to test above function int main()
{ int arr[] = { 23, 10, 20, 11, 12, 6, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
pancakeSort(arr, n);
puts ( "Sorted Array " );
printArray(arr, n);
return 0;
} |
Output:
Sorted Array 6 7 10 11 12 20 23
Time Complexity: O(n2)
Auxiliary Space: O(1)
Please refer complete article on Pancake sorting for more details!
Recommended Articles