Given an unsorted array, the task is to sort the given array. You are allowed to do only following operation on array.
- flip(arr, i): Reverse array from 0 to i
Examples:
Input: arr[] = { 23, 10, 20, 11, 12, 6, 7 }
Output: { 6, 7, 10, 11, 12, 20, 23}
Input: arr[] = { 0, 1, 1, 0, 0 }
Output: { 0, 0, 0, 1, 1 }
Approach: Unlike 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 idea is to do something similar to Selection Sort. We one by one place maximum element at the end and reduce the size of current array by one.
Following are the detailed steps. Let given array be arr[] and size of array be n.
- 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
- Find index of the maximum element in arr[0 to curr_szie-1]. Let the index be ‘mi’
- Call flip(arr, mi)
- Call flip(arr, curr_size – 1)
See following video for visualization of the above algorithm.
http://www.youtube.com/embed/kk-_DDgoXfk
Below is the implementation:
C
#include <stdio.h>
#include <stdlib.h>
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--;
}
}
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;
}
void pancakeSort( int * arr, int n)
{
for ( int curr_size = n; curr_size > 1;
--curr_size)
{
int mi = findMax(arr, curr_size);
if (mi != curr_size - 1) {
flip(arr, mi);
flip(arr, curr_size - 1);
}
}
}
void printArray( int arr[], int n)
{
for ( int i = 0; i < n; ++i)
printf ( "%d " , arr[i]);
}
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;
}
|
CPP
#include<bits/stdc++.h>
using namespace std;
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--;
}
}
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;
}
void pancakeSort( int *arr, int n)
{
for ( int curr_size = n; curr_size > 1;
--curr_size)
{
int mi = findMax(arr, curr_size);
if (mi != curr_size-1)
{
flip(arr, mi);
flip(arr, curr_size-1);
}
}
}
void printArray( int arr[], int n)
{
for ( int i = 0; i < n; ++i)
cout<< arr[i]<< " " ;
}
int main()
{
int arr[] = {23, 10, 20, 11, 12, 6, 7};
int n = sizeof (arr)/ sizeof (arr[0]);
pancakeSort(arr, n);
cout<< "Sorted Array " <<endl;
printArray(arr, n);
return 0;
}
|
Java
import java.io.*;
class PancakeSort {
static 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--;
}
}
static 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;
}
static int pancakeSort( int arr[], int n)
{
for ( int curr_size = n; curr_size > 1 ;
--curr_size)
{
int mi = findMax(arr, curr_size);
if (mi != curr_size- 1 )
{
flip(arr, mi);
flip(arr, curr_size- 1 );
}
}
return 0 ;
}
static void printArray( int arr[], int arr_size)
{
for ( int i = 0 ; i < arr_size; i++)
System.out.print(arr[i] + " " );
System.out.println( "" );
}
public static void main (String[] args)
{
int arr[] = { 23 , 10 , 20 , 11 , 12 , 6 , 7 };
int n = arr.length;
pancakeSort(arr, n);
System.out.println( "Sorted Array: " );
printArray(arr, n);
}
}
|
Python3
def flip(arr, i):
start = 0
while start < i:
temp = arr[start]
arr[start] = arr[i]
arr[i] = temp
start + = 1
i - = 1
def findMax(arr, n):
mi = 0
for i in range ( 0 ,n):
if arr[i] > arr[mi]:
mi = i
return mi
def pancakeSort(arr, n):
curr_size = n
while curr_size > 1 :
mi = findMax(arr, curr_size)
if mi ! = curr_size - 1 :
flip(arr, mi)
flip(arr, curr_size - 1 )
curr_size - = 1
def printArray(arr, n):
for i in range ( 0 ,n):
print ( "%d" % ( arr[i]),end = " " )
arr = [ 23 , 10 , 20 , 11 , 12 , 6 , 7 ]
n = len (arr)
pancakeSort(arr, n);
print ( "Sorted Array " )
printArray(arr,n)
|
C#
using System;
class GFG {
static 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--;
}
}
static 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;
}
static int pancakeSort( int []arr, int n)
{
for ( int curr_size = n; curr_size > 1;
--curr_size)
{
int mi = findMax(arr, curr_size);
if (mi != curr_size - 1)
{
flip(arr, mi);
flip(arr, curr_size - 1);
}
}
return 0;
}
static void printArray( int []arr,
int arr_size)
{
for ( int i = 0; i < arr_size; i++)
Console.Write(arr[i] + " " );
Console.Write( "" );
}
public static void Main ()
{
int []arr = {23, 10, 20, 11, 12, 6, 7};
int n = arr.Length;
pancakeSort(arr, n);
Console.Write( "Sorted Array: " );
printArray(arr, n);
}
}
|
PHP
<?php
function flip(& $arr , $i )
{
$start = 0;
while ( $start < $i )
{
$temp = $arr [ $start ];
$arr [ $start ] = $arr [ $i ];
$arr [ $i ] = $temp ;
$start ++;
$i --;
}
}
function findMax( $arr , $n )
{
$mi = 0;
for ( $i = 0; $i < $n ; ++ $i )
if ( $arr [ $i ] > $arr [ $mi ])
$mi = $i ;
return $mi ;
}
function pancakeSort(& $arr , $n )
{
for ( $curr_size = $n ; $curr_size > 1;
-- $curr_size )
{
$mi = findMax( $arr , $curr_size );
if ( $mi != $curr_size -1)
{
flip( $arr , $mi );
flip( $arr , $curr_size -1);
}
}
}
function printArray( $arr , $n )
{
for ( $i = 0; $i < $n ; ++ $i )
print ( $arr [ $i ]. " " );
}
$arr = array (23, 10, 20, 11, 12, 6, 7);
$n = count ( $arr );
pancakeSort( $arr , $n );
echo ( "Sorted Array \n" );
printArray( $arr , $n );
return 0;
?>
|
Javascript
<script>
function flip(arr, i)
{
let temp, start = 0;
while (start < i)
{
temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
start++;
i--;
}
}
function findMax(arr, n)
{
let mi, i;
for (mi = 0, i = 0; i < n; ++i)
if (arr[i] > arr[mi])
mi = i;
return mi;
}
function pancakeSort(arr, n)
{
for (let curr_size = n; curr_size > 1; --curr_size)
{
let mi = findMax(arr, curr_size);
if (mi != curr_size - 1)
{
flip(arr, mi);
flip(arr, curr_size - 1);
}
}
return 0;
}
function printArray(arr, arr_size)
{
for (let i = 0; i < arr_size; i++)
document.write(arr[i] + " " );
document.write( "" );
}
let arr = [23, 10, 20, 11, 12, 6, 7];
let n = arr.length;
pancakeSort(arr, n);
document.write( "Sorted Array: " + "</br>" );
printArray(arr, n);
</script>
|
Output
Sorted Array
6 7 10 11 12 20 23
Time Complexity: O(n2), Total O(n) flip operations are performed in above code
Auxiliary Space: O(1)
Recursive Approach
Another approach to implement pancake sort in C++ is by using a recursive algorithm .
Approach :
Step 1: Define a function to flip a subarray of the given array. This function takes two arguments: the array to be flipped, and the index of the last element of the subarray to be flipped.
Step 2: Define a function to find the index of the maximum element in a given subarray of the array. This function takes two arguments: the array to be searched, and the index of the last element of the subarray to be searched.
Step 3: Iterate over the input array from the end towards the beginning, and for each element i, do the following:
- Find the index of the maximum element in the subarray arr[0:i].
- If the maximum element is not already at the end of the subarray, flip the subarray arr[0:max_index].
- Flip the entire subarray arr[0:i] to move the element i to its correct position.
Step 4: Repeat Step 3 for the subarray arr[0:n-1], arr[0:n-2], …, arr[0:1] until the entire array is sorted.
Implementation Of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
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--;
}
}
void pancakeSort( int arr[], int n)
{
if (n == 1)
return ;
int mi = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] > arr[mi]) {
mi = i;
}
}
if (mi != 0) {
flip(arr, mi);
}
flip(arr, n - 1);
pancakeSort(arr, n - 1);
}
int main()
{
int arr[] = { 23, 10, 20, 11, 12, 6, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
pancakeSort(arr, n);
cout << "Sorted Array: " ;
for ( int i = 0; i < n; i++) {
cout << arr[i] << " " ;
}
cout << endl;
return 0;
}
|
Java
import java.util.*;
public class PancakeSort {
static 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--;
}
}
static void pancakeSort( int arr[], int n)
{
if (n == 1 )
return ;
int mi = 0 ;
for ( int i = 0 ; i < n; i++) {
if (arr[i] > arr[mi]) {
mi = i;
}
}
if (mi != 0 ) {
flip(arr, mi);
}
flip(arr, n - 1 );
pancakeSort(arr, n - 1 );
}
public static void main(String args[])
{
int arr[] = { 23 , 10 , 20 , 11 , 12 , 6 , 7 };
int n = arr.length;
pancakeSort(arr, n);
System.out.print( "Sorted Array: " );
for ( int i = 0 ; i < n; i++) {
System.out.print(arr[i] + " " );
}
System.out.println();
}
}
|
Python3
def flip(arr, i):
start = 0
while start < i:
temp = arr[start]
arr[start] = arr[i]
arr[i] = temp
start + = 1
i - = 1
def pancakeSort(arr, n):
if n = = 1 :
return
mi = 0
for i in range (n):
if arr[i] > arr[mi]:
mi = i
if mi ! = 0 :
flip(arr, mi)
flip(arr, n - 1 )
pancakeSort(arr, n - 1 )
arr = [ 23 , 10 , 20 , 11 , 12 , 6 , 7 ]
n = len (arr)
pancakeSort(arr, n)
print ( "Sorted Array:" , end = " " )
for i in range (n):
print (arr[i], end = " " )
print ()
|
C#
using System;
class Program {
static 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--;
}
}
static void PancakeSort( int [] arr, int n)
{
if (n == 1)
return ;
int mi = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] > arr[mi]) {
mi = i;
}
}
if (mi != 0) {
Flip(arr, mi);
}
Flip(arr, n - 1);
PancakeSort(arr, n - 1);
}
static void Main()
{
int [] arr = { 23, 10, 20, 11, 12, 6, 7 };
int n = arr.Length;
PancakeSort(arr, n);
Console.Write( "Sorted Array: " );
for ( int i = 0; i < n; i++) {
Console.Write(arr[i] + " " );
}
Console.WriteLine();
}
}
|
Javascript
function flip(arr, i) {
let start = 0;
while (start < i) {
let temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
start++;
i--;
}
}
function pancakeSort(arr, n) {
if (n === 1) {
return ;
}
let mi = 0;
for (let i = 0; i < n; i++) {
if (arr[i] > arr[mi]) {
mi = i;
}
}
if (mi !== 0) {
flip(arr, mi);
}
flip(arr, n - 1);
pancakeSort(arr, n - 1);
}
let arr = [23, 10, 20, 11, 12, 6, 7];
let n = arr.length;
pancakeSort(arr, n);
console.log( "Sorted Array: " + arr.join( " " ));
|
Output
Sorted Array: 6 7 10 11 12 20 23
Complexity Analysis:
- The time complexity of pancake sort is O(n2), where n is the size of the input array. The worst case occurs when the input array is reverse sorted.
- The space complexity is O(1) since the sorting is done in-place.
References:
http://en.wikipedia.org/wiki/Pancake_sorting
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
11 Apr, 2023
Like Article
Save Article