Цицле Сорт
Циклусно сортирање је алгоритам за нестабилно сортирање на месту који је посебно користан када се сортирају низови који садрже елементе са малим опсегом вредности. Развио га је В. Д. Јонес и објавио 1963. године.
Основна идеја иза сортирања циклуса је да се улазни низ подели на циклусе где се сваки циклус састоји од елемената који припадају истој позицији у сортираном излазном низу. Алгоритам затим изводи серију замена да би поставио сваки елемент на његову исправну позицију унутар свог циклуса док се сви циклуси не заврше и низ не сортира.
Ево корак по корак објашњења алгоритма сортирања циклуса:
- Почните са несортираним низом од н елемената.
- Иницијализујте променљиву циклус Старт на 0.
- За сваки елемент у низу упоредите га са сваким другим елементом са његове десне стране. Ако постоје елементи који су мањи од тренутног прираста елемента, циклус Старт.
- Ако је ЦицлеСтарт и даље 0 након поређења првог елемента са свим осталим елементима, пређите на следећи елемент и поновите корак 3.
- Када се пронађе мањи елемент, замените тренутни елемент са првим елементом у његовом циклусу. Циклус се затим наставља све док се тренутни елемент не врати у првобитни положај.
Поновите кораке 3-5 док се сви циклуси не заврше.
Низ је сада сортиран.
Једна од предности циклусног сортирања је да има мали меморијски отисак јер сортира низ на месту и не захтева додатну меморију за привремене варијабле или бафере. Међутим, може бити спор у одређеним ситуацијама, посебно када улазни низ има велики опсег вредности. Без обзира на то, циклусно сортирање остаје користан алгоритам за сортирање у одређеним контекстима, као што је при сортирању малих низова са ограниченим опсегом вредности.
Циклусно сортирање је алгоритам за сортирање на месту нестабилан алгоритам сортирања и сортирање поређења које је теоретски оптимално у смислу укупног броја уписа у оригинални низ.
- Оптимално је у погледу броја уписа у меморију. То минимизира број уписа у меморију за сортирање (Свака вредност се или уписује нула пута ако је већ на исправном положају или се уписује једном на своју тачну позицију.)
- Заснован је на идеји да се низ који се сортира може поделити на циклусе. Циклуси се могу приказати као граф. Имамо н чворова и ивицу усмерену од чвора и до чвора ј ако елемент на и-том индексу мора бити присутан на ј-том индексу у сортираном низу.
Циклус у арр[] = {2 4 5 1 3}
Циклус у арр[] = {2 4 5 1 3} - Циклус у арр[] = {4 3 2 1}
Циклус у арр[] = {4 3 2 1}
Ми један по један разматрамо све циклусе. Прво разматрамо циклус који укључује први елемент. Проналазимо тачан положај првог елемента и постављамо га на његову тачну позицију рецимо ј. Разматрамо стару вредност арр[ј] и проналазимо њену тачну позицију, настављамо да радимо све док сви елементи тренутног циклуса не буду постављени на исправну позицију, тј. не вратимо се на почетну тачку циклуса.
Псеудокод:
Begin
for
start:= 0 to n - 2 do
key := array[start]
location := start
for i:= start + 1 to n-1 do
if array[i] < key then
location: =location +1
done
if location = start then
ignore lower part go for next iteration
while key = array[location] do
location: = location + 1
done
if location != start then
swap array[location] with key
while location != start do
location start
for i:= start + 1 to n-1 do
if array[i] < key then
location: =location +1
done
while key= array[location]
location := location +1
if key != array[location]
Swap array[location] and key
done
done
EndОбјашњење:
arr[] = {10 5 2 3}
index = 0 1 2 3
cycle_start = 0
item = 10 = arr[0]
Find position where we put the item
pos = cycle_start
i=pos+1
while(i
if (arr[i] < item)
pos++;
We put 10 at arr[3] and change item to
old value of arr[3].
arr[] = {10 5 2 10 }
item = 3
Again rotate rest cycle that start with index '0'
Find position where we put the item = 3
we swap item with element at arr[1] now
arr[] = {10 3 2 10 }
item = 5
Again rotate rest cycle that start with index '0' and item = 5
we swap item with element at arr[2].
arr[] = {10 3 5 10 }
item = 2
Again rotate rest cycle that start with index '0' and item = 2
arr[] = { 2 3 5 10 }
Above is one iteration for cycle_stat = 0.
Repeat above steps for cycle_start = 1 2 ..n-2Испод је примена горњег приступа:
CPPJava// C++ program to implement cycle sort #includeusing namespace std ; // Function sort the array using Cycle sort 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 ++ ) { // initialize item as starting point int item = arr [ cycle_start ]; // Find position where we put the item. We basically // count all smaller elements on right side of item. int pos = cycle_start ; for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos ++ ; // If item is already in correct position if ( pos == cycle_start ) continue ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( pos != cycle_start ) { swap ( item arr [ pos ]); writes ++ ; } // Rotate rest of the cycle while ( pos != cycle_start ) { pos = cycle_start ; // Find position where we put the element for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos += 1 ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( item != arr [ pos ]) { swap ( item arr [ pos ]); writes ++ ; } } } // Number of memory writes or swaps // cout < < writes < < endl ; } // Driver program to test above function int main () { int arr [] = { 1 8 3 9 10 10 2 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 ; } Python3// Java program to implement cycle sort import java.util.* ; import java.lang.* ; class GFG { // Function sort the array using Cycle sort public static 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 ++ ) { // initialize item as starting point int item = arr [ cycle_start ] ; // Find position where we put the item. We basically // count all smaller elements on right side of item. int pos = cycle_start ; for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos ++ ; // If item is already in correct position if ( pos == cycle_start ) continue ; // ignore all duplicate elements while ( item == arr [ pos ] ) pos += 1 ; // put the item to it's right position if ( pos != cycle_start ) { int temp = item ; item = arr [ pos ] ; arr [ pos ] = temp ; writes ++ ; } // Rotate rest of the cycle while ( pos != cycle_start ) { pos = cycle_start ; // Find position where we put the element for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos += 1 ; // ignore all duplicate elements while ( item == arr [ pos ] ) pos += 1 ; // put the item to it's right position if ( item != arr [ pos ] ) { int temp = item ; item = arr [ pos ] ; arr [ pos ] = temp ; writes ++ ; } } } } // Driver program to test above function public static void main ( String [] args ) { int arr [] = { 1 8 3 9 10 10 2 4 }; int n = arr . length ; cycleSort ( arr n ); System . out . println ( 'After sort : ' ); for ( int i = 0 ; i < n ; i ++ ) System . out . print ( arr [ i ] + ' ' ); } } // Code Contributed by Mohit Gupta_OMG <(0_o)>C## Python program to implement cycle sort def cycleSort ( array ): writes = 0 # Loop through the array to find cycles to rotate. for cycleStart in range ( 0 len ( array ) - 1 ): item = array [ cycleStart ] # Find where to put the item. pos = cycleStart for i in range ( cycleStart + 1 len ( array )): if array [ i ] < item : pos += 1 # If the item is already there this is not a cycle. if pos == cycleStart : continue # Otherwise put the item there or right after any duplicates. while item == array [ pos ]: pos += 1 array [ pos ] item = item array [ pos ] writes += 1 # Rotate the rest of the cycle. while pos != cycleStart : # Find where to put the item. pos = cycleStart for i in range ( cycleStart + 1 len ( array )): if array [ i ] < item : pos += 1 # Put the item there or right after any duplicates. while item == array [ pos ]: pos += 1 array [ pos ] item = item array [ pos ] writes += 1 return writes # driver code arr = [ 1 8 3 9 10 10 2 4 ] n = len ( arr ) cycleSort ( arr ) print ( 'After sort : ' ) for i in range ( 0 n ) : print ( arr [ i ] end = ' ' ) # Code Contributed by Mohit Gupta_OMG <(0_o)>JavaScript// C# program to implement cycle sort using System ; class GFG { // Function sort the array using Cycle sort public static 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 ++ ) { // initialize item as starting point int item = arr [ cycle_start ]; // Find position where we put the item. // We basically count all smaller elements // on right side of item. int pos = cycle_start ; for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos ++ ; // If item is already in correct position if ( pos == cycle_start ) continue ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( pos != cycle_start ) { int temp = item ; item = arr [ pos ]; arr [ pos ] = temp ; writes ++ ; } // Rotate rest of the cycle while ( pos != cycle_start ) { pos = cycle_start ; // Find position where we put the element for ( int i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos += 1 ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( item != arr [ pos ]) { int temp = item ; item = arr [ pos ]; arr [ pos ] = temp ; writes ++ ; } } } } // Driver program to test above function public static void Main () { int [] arr = { 1 8 3 9 10 10 2 4 }; int n = arr . Length ; // Function calling cycleSort ( arr n ); Console . WriteLine ( 'After sort : ' ); for ( int i = 0 ; i < n ; i ++ ) Console . Write ( arr [ i ] + ' ' ); } } // This code is contributed by Nitin Mittal< script > // Javascript program to implement cycle sort // Function sort the array using Cycle sort function cycleSort ( arr n ) { // count number of memory writes let writes = 0 ; // traverse array elements and put it to on // the right place for ( let cycle_start = 0 ; cycle_start <= n - 2 ; cycle_start ++ ) { // initialize item as starting point let item = arr [ cycle_start ]; // Find position where we put the item. We basically // count all smaller elements on right side of item. let pos = cycle_start ; for ( let i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos ++ ; // If item is already in correct position if ( pos == cycle_start ) continue ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( pos != cycle_start ) { let temp = item ; item = arr [ pos ]; arr [ pos ] = temp ; writes ++ ; } // Rotate rest of the cycle while ( pos != cycle_start ) { pos = cycle_start ; // Find position where we put the element for ( let i = cycle_start + 1 ; i < n ; i ++ ) if ( arr [ i ] < item ) pos += 1 ; // ignore all duplicate elements while ( item == arr [ pos ]) pos += 1 ; // put the item to it's right position if ( item != arr [ pos ]) { let temp = item ; item = arr [ pos ]; arr [ pos ] = temp ; writes ++ ; } } } } // Driver code let arr = [ 1 8 3 9 10 10 2 4 ]; let n = arr . length ; cycleSort ( arr n ); document . write ( 'After sort : ' + '
' ); for ( let i = 0 ; i < n ; i ++ ) document . write ( arr [ i ] + ' ' ); // This code is contributed by susmitakundugoaldanga. < /script>
ИзлазAfter sort : 1 2 3 4 8 9 10 10Анализа временске сложености :
- Најгори случај: О(н 2 )
- Просечан случај: О(н 2 )
- Најбољи случај: О(н 2 )
Помоћни простор: О(1)
- Сложеност простора је константна јер је овај алгоритам на месту тако да не користи додатну меморију за сортирање.
2. метод: Овај метод је применљив само када су дате вредности низа или елементи у опсегу од 1 до Н или 0 до Н. У овој методи не морамо да ротирамо низ
приступ : Све дате вредности низа треба да буду у опсегу од 1 до Н или 0 до Н. Ако је опсег од 1 до Н онда ће исправна позиција сваког елемента низа бити индекс == вредност-1, тј. значи да ће на 0. вредности индекса бити 1 на сличан начин на 1. вредности позиције индекса ће бити 2 и тако даље до н-те вредности.
Слично за вредности од 0 до Н тачна позиција индекса сваког елемента низа или вредности ће бити иста као и његова вредност, тј. на 0. индексу 0 ће бити тамо 1. позиција 1 ће бити тамо.
Објашњење:
arr[] = {5 3 1 4 2}
index = 0 1 2 3 4
i = 0;
while( i < arr.length)
correctposition = arr[i]-1;
find ith item correct position
for the first time i = 0 arr[0] = 5 correct index of 5 is 4 so arr[i] - 1 = 5-1 = 4
if( arr[i] <= arr.length && arr[i] != arr[correctposition])
arr[i] = 5 and arr[correctposition] = 4
so 5 <= 5 && 5 != 4 if condition true
now swap the 5 with 4
int temp = arr[i];
arr[i] = arr[correctposition];
arr[correctposition] = temp;
now resultant arr at this after 1st swap
arr[] = {2 3 1 4 5} now 5 is shifted at its correct position
now loop will run again check for i = 0 now arr[i] is = 2
after swapping 2 at its correct position
arr[] = {3 2 1 4 5}
now loop will run again check for i = 0 now arr[i] is = 3
after swapping 3 at its correct position
arr[] = {1 2 3 4 5}
now loop will run again check for i = 0 now arr[i] is = 1
this time 1 is at its correct position so else block will execute and i will increment i = 1;
once i exceeds the size of array will get array sorted.
arr[] = {1 2 3 4 5}
else
i++;
loop end;
once while loop end we get sorted array just print it
for( index = 0 ; index < arr.length; index++)
print(arr[index] + ' ')
sorted arr[] = {1 2 3 4 5}Испод је примена горњег приступа:
C++Java#includeusing namespace std ; void cyclicSort ( int arr [] int n ){ int i = 0 ; while ( i < n ) { // as array is of 1 based indexing so the // correct position or index number of each // element is element-1 i.e. 1 will be at 0th // index similarly 2 correct index will 1 so // on... int correct = arr [ i ] - 1 ; if ( arr [ i ] != arr [ correct ]){ // if array element should be lesser than // size and array element should not be at // its correct position then only swap with // its correct position or index value swap ( arr [ i ] arr [ correct ]) ; } else { // if element is at its correct position // just increment i and check for remaining // array elements i ++ ; } } } void printArray ( int arr [] int size ) { int i ; for ( i = 0 ; i < size ; i ++ ) cout < < arr [ i ] < < ' ' ; cout < < endl ; } int main () { int arr [] = { 3 2 4 5 1 }; int n = sizeof ( arr ) / sizeof ( arr [ 0 ]); cout < < 'Before sorting array: n ' ; printArray ( arr n ); cyclicSort ( arr n ); cout < < 'Sorted array: n ' ; printArray ( arr n ); return 0 ; } Python// java program to check implement cycle sort import java.util.* ; public class MissingNumber { public static void main ( String [] args ) { int [] arr = { 3 2 4 5 1 }; int n = arr . length ; System . out . println ( 'Before sort :' ); System . out . println ( Arrays . toString ( arr )); CycleSort ( arr n ); } static void CycleSort ( int [] arr int n ) { int i = 0 ; while ( i < n ) { // as array is of 1 based indexing so the // correct position or index number of each // element is element-1 i.e. 1 will be at 0th // index similarly 2 correct index will 1 so // on... int correctpos = arr [ i ] - 1 ; if ( arr [ i ] < n && arr [ i ] != arr [ correctpos ] ) { // if array element should be lesser than // size and array element should not be at // its correct position then only swap with // its correct position or index value swap ( arr i correctpos ); } else { // if element is at its correct position // just increment i and check for remaining // array elements i ++ ; } } System . out . println ( 'After sort : ' ); System . out . print ( Arrays . toString ( arr )); } static void swap ( int [] arr int i int correctpos ) { // swap elements with their correct indexes int temp = arr [ i ] ; arr [ i ] = arr [ correctpos ] ; arr [ correctpos ] = temp ; } } // this code is contributed by devendra solunkeC## Python program to check implement cycle sort def cyclicSort ( arr n ): i = 0 while i < n : # as array is of 1 based indexing so the # correct position or index number of each # element is element-1 i.e. 1 will be at 0th # index similarly 2 correct index will 1 so # on... correct = arr [ i ] - 1 if arr [ i ] != arr [ correct ]: # if array element should be lesser than # size and array element should not be at # its correct position then only swap with # its correct position or index value arr [ i ] arr [ correct ] = arr [ correct ] arr [ i ] else : # if element is at its correct position # just increment i and check for remaining # array elements i += 1 def printArray ( arr ): print ( * arr ) arr = [ 3 2 4 5 1 ] n = len ( arr ) print ( 'Before sorting array:' ) printArray ( arr ) # Function Call cyclicSort ( arr n ) print ( 'Sorted array:' ) printArray ( arr ) # This Code is Contributed by Prasad Kandekar(prasad264)JavaScriptusing System ; public class GFG { static void CycleSort ( int [] arr int n ) { int i = 0 ; while ( i < n ) { // as array is of 1 based indexing so the // correct position or index number of each // element is element-1 i.e. 1 will be at 0th // index similarly 2 correct index will 1 so // on... int correctpos = arr [ i ] - 1 ; if ( arr [ i ] < n && arr [ i ] != arr [ correctpos ]) { // if array element should be lesser than // size and array element should not be at // its correct position then only swap with // its correct position or index value swap ( arr i correctpos ); } else { // if element is at its correct position // just increment i and check for remaining // array elements i ++ ; } } Console . Write ( 'nAfter sort : ' ); for ( int index = 0 ; index < n ; index ++ ) Console . Write ( arr [ index ] + ' ' ); } static void swap ( int [] arr int i int correctpos ) { // swap elements with their correct indexes int temp = arr [ i ]; arr [ i ] = arr [ correctpos ]; arr [ correctpos ] = temp ; } static public void Main () { // Code int [] arr = { 3 2 4 5 1 }; int n = arr . Length ; Console . Write ( 'Before sort : ' ); for ( int i = 0 ; i < n ; i ++ ) Console . Write ( arr [ i ] + ' ' ); CycleSort ( arr n ); } } // This code is contributed by devendra solunke// JavaScript code for the above code function cyclicSort ( arr n ) { var i = 0 ; while ( i < n ) { // as array is of 1 based indexing so the // correct position or index number of each // element is element-1 i.e. 1 will be at 0th // index similarly 2 correct index will 1 so // on... let correct = arr [ i ] - 1 ; if ( arr [ i ] !== arr [ correct ]) { // if array element should be lesser than // size and array element should not be at // its correct position then only swap with // its correct position or index value [ arr [ i ] arr [ correct ]] = [ arr [ correct ] arr [ i ]]; } else { // if element is at its correct position // just increment i and check for remaining // array elements i ++ ; } } } function printArray ( arr size ) { for ( var i = 0 ; i < size ; i ++ ) { console . log ( arr [ i ] + ' ' ); } console . log ( 'n' ); } var arr = [ 3 2 4 5 1 ]; var n = arr . length ; console . log ( 'Before sorting array: n' ); printArray ( arr n ); cyclicSort ( arr n ); console . log ( 'Sorted array: n' ); printArray ( arr n ); // This Code is Contributed by Prasad Kandekar(prasad264)
ИзлазBefore sorting array: 3 2 4 5 1 Sorted array: 1 2 3 4 5Анализа временске сложености:
- Најгори случај: О(н)
- Просечан случај: О(н)
- Најбољи случај: О(н)
Помоћни простор: О(1)
Предност сортирања циклуса:
- Није потребно додатно складиштење.
- алгоритам сортирања на месту.
- Минимални број уписа у меморију
- Сортирање циклуса је корисно када је низ похрањен у ЕЕПРОМ или ФЛАСХ.
Недостатак сортирања циклуса:
- Не користи се углавном.
- Има већу временску сложеност о(н^2)
- Нестабилан алгоритам сортирања.
Апликација циклусног сортирања:
Креирај квиз
- Овај алгоритам за сортирање је најпогоднији за ситуације у којима су операције писања или замене меморије скупе.
- Корисно за сложене проблеме.