#include <iostream>
using namespace std;
void cycleSort ( int arr[ ] , int n)
{
// count number of memory writes
int writes = 0 ;
// traverse array elements and put it to on
// the right place
for ( int cycle_start= 0 ; cycle_start<= n- 2 ; cycle_start++ )
{
int item = arr[ cycle_start] ;
cout << "item 1: " << arr[ cycle_start] << endl;
int pos = cycle_start;
for ( int i = cycle_start+ 1 ; i< n; i++ )
if ( arr[ i] < item)
pos++ ;
cout << "Pos 1 value " << pos<< " and array value at pos is " << arr[ pos] << endl;
if ( pos == cycle_start)
continue ;
while ( item == arr[ pos] )
pos + = 1 ;
cout << "array element at pos 1: " << arr[ pos] << endl;
if ( pos ! = cycle_start)
{
cout << "inside first swap" << endl;
swap( item, arr[ pos] ) ;
writes++ ;
}
for ( int k= 0 ; k< n; k++ )
cout << arr[ k] << "\t " ;
cout << endl;
while ( pos ! = cycle_start)
{
cout << "inside while 2" << endl;
cout << "item 2: " << arr[ cycle_start] << endl;
pos = cycle_start;
for ( int i = cycle_start+ 1 ; i< n; i++ )
if ( arr[ i] < item)
cout << "Pos 2: " << pos++ ;
cout << endl;
while ( item == arr[ pos] )
{
pos + = 1 ;
cout << "inside while 3" << endl;
}
if ( item ! = arr[ pos] )
{
swap( item, arr[ pos] ) ;
cout << "inside if 2" << endl;
writes++ ;
}
}
}
// Number of memory writes or swaps
// cout << writes << endl ;
}
int main( )
{
int arr[ ] = { 7 ,2 ,1 ,3 ,0 ,7 ,- 1 ,7 ,4 } ;
int n = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
cycleSort( arr, n) ;
cout << "After sort : " << endl;
for ( int i = 0 ; i< n; i++ )
cout << arr[ i] << " " ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBjeWNsZVNvcnQgKGludCBhcnJbXSwgaW50IG4pCnsKICAgIC8vIGNvdW50IG51bWJlciBvZiBtZW1vcnkgd3JpdGVzCiAgICBpbnQgd3JpdGVzID0gMDsKCiAgICAvLyB0cmF2ZXJzZSBhcnJheSBlbGVtZW50cyBhbmQgcHV0IGl0IHRvIG9uCiAgICAvLyB0aGUgcmlnaHQgcGxhY2UKICAgIGZvciAoaW50IGN5Y2xlX3N0YXJ0PTA7IGN5Y2xlX3N0YXJ0PD1uLTI7IGN5Y2xlX3N0YXJ0KyspCiAgICB7CgogICAgICAgIGludCBpdGVtID0gYXJyW2N5Y2xlX3N0YXJ0XTsKCiAgICAgICAgY291dDw8Iml0ZW0gMTogIjw8YXJyW2N5Y2xlX3N0YXJ0XTw8ZW5kbDsKCgogICAgICAgIGludCBwb3MgPSBjeWNsZV9zdGFydDsKCiAgICAgICAgZm9yIChpbnQgaSA9IGN5Y2xlX3N0YXJ0KzE7IGk8bjsgaSsrKQogICAgICAgICAgICBpZiAoYXJyW2ldIDwgaXRlbSkKICAgICAgICAgICAgICAgIHBvcysrOwoKICAgICAgIGNvdXQ8PCJQb3MgMSB2YWx1ZSAiPDxwb3M8PCIgYW5kIGFycmF5IHZhbHVlIGF0IHBvcyBpcyAiPDxhcnJbcG9zXSA8PGVuZGw7CgogICAgICAgIGlmIChwb3MgPT0gY3ljbGVfc3RhcnQpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKCiAgICAgICAgd2hpbGUgKGl0ZW0gPT0gYXJyW3Bvc10pCiAgICAgICAgICAgIHBvcyArPSAxOwoKICAgICAgICBjb3V0PDwiYXJyYXkgZWxlbWVudCBhdCBwb3MgMTogIjw8YXJyW3Bvc108PGVuZGw7CgogICAgICAgIGlmIChwb3MgIT0gY3ljbGVfc3RhcnQpCiAgICAgICAgewogICAgICAgICAgICBjb3V0PDwiaW5zaWRlIGZpcnN0IHN3YXAiPDxlbmRsOwogICAgICAgICAgICBzd2FwKGl0ZW0sIGFycltwb3NdKTsKICAgICAgICAgICAgd3JpdGVzKys7CiAgICAgICAgfQoKICAgICAgICBmb3IoaW50IGs9MDsgazxuOyBrKyspCiAgICAgICAgY291dDw8YXJyW2tdPDwiXHQiOwoKICAgICAgICBjb3V0PDxlbmRsOwoKCiAgICAgICAgd2hpbGUgKHBvcyAhPSBjeWNsZV9zdGFydCkKICAgICAgICB7CgogICAgICAgICAgICBjb3V0PDwiaW5zaWRlIHdoaWxlIDIiPDxlbmRsOwoKICAgICAgICAgICAgY291dDw8Iml0ZW0gMjogIjw8YXJyW2N5Y2xlX3N0YXJ0XTw8ZW5kbDsKCiAgICAgICAgICAgIHBvcyA9IGN5Y2xlX3N0YXJ0OwoKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSBjeWNsZV9zdGFydCsxOyBpPG47IGkrKykKICAgICAgICAgICAgICAgIGlmIChhcnJbaV0gPCBpdGVtKQogICAgICAgICAgICAgICAgICAgIGNvdXQ8PCJQb3MgMjogIjw8cG9zKys7CgogICAgICAgICAgICBjb3V0PDxlbmRsOwoKCiAgICAgICAgICAgIHdoaWxlIChpdGVtID09IGFycltwb3NdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcG9zICs9IDE7CiAgICAgICAgICAgICAgICAgY291dDw8Imluc2lkZSB3aGlsZSAzIjw8ZW5kbDsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIGlmIChpdGVtICE9IGFycltwb3NdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2FwKGl0ZW0sIGFycltwb3NdKTsKICAgICAgICAgICAgICAgIGNvdXQ8PCJpbnNpZGUgaWYgMiI8PGVuZGw7CiAgICAgICAgICAgICAgICB3cml0ZXMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgfQoKICAgIC8vIE51bWJlciBvZiBtZW1vcnkgd3JpdGVzIG9yIHN3YXBzCiAgICAvLyBjb3V0IDw8IHdyaXRlcyA8PCBlbmRsIDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgYXJyW10gPSB7NywyLDEsMywwLDcsLTEsNyw0fTsKICAgIGludCBuID0gc2l6ZW9mKGFycikvc2l6ZW9mKGFyclswXSk7CiAgICBjeWNsZVNvcnQoYXJyLCAgbikgOwoKICAgIGNvdXQgPDwgIkFmdGVyIHNvcnQgOiAiIDw8ZW5kbDsKICAgIGZvciAoaW50IGkgPTA7IGk8bjsgaSsrKQogICAgICAgIGNvdXQgPDwgYXJyW2ldIDw8ICIgIjsKICAgIHJldHVybiAwOwp9Cg==