Цикълното сортиране е алгоритъм за нестабилно сортиране на място, който е особено полезен при сортиране на масиви, съдържащи елементи с малък диапазон от стойности. Разработен е от W. D. Jones и е публикуван през 1963 г.
Основната идея зад цикличното сортиране е да се раздели входният масив на цикли, където всеки цикъл се състои от елементи, които принадлежат на една и съща позиция в сортирания изходен масив. След това алгоритъмът извършва поредица от суапове, за да постави всеки елемент на правилната му позиция в неговия цикъл, докато всички цикли завършат и масивът бъде сортиран.
Ето стъпка по стъпка обяснение на алгоритъма за циклично сортиране:
- Започнете с несортиран масив от n елемента.
- Инициализирайте променлива cycleStart на 0.
- За всеки елемент в масива го сравнете с всеки друг елемент отдясно. Ако има елементи, които са по-малки от текущия елемент, се увеличава cycleStart.
- Ако cycleStart все още е 0 след сравняване на първия елемент с всички останали елементи, преминете към следващия елемент и повторете стъпка 3.
- След като бъде намерен по-малък елемент, разменете текущия елемент с първия елемент в неговия цикъл. След това цикълът продължава, докато текущият елемент се върне в първоначалната си позиция.
Повторете стъпки 3-5, докато не завършат всички цикли.
Сега масивът е сортиран.
Едно от предимствата на цикличното сортиране е, че има малък отпечатък от паметта, тъй като сортира масива на място и не изисква допълнителна памет за временни променливи или буфери. Въпреки това може да бъде бавен в определени ситуации, особено когато входният масив има голям диапазон от стойности. Въпреки това цикличното сортиране остава полезен алгоритъм за сортиране в определени контексти, като например при сортиране на малки масиви с ограничени диапазони от стойности.
Цикълното сортиране е алгоритъм за сортиране на място нестабилен алгоритъм за сортиране и сортиране за сравнение, което е теоретично оптимално по отношение на общия брой записи в оригиналния масив.
подрязване на javascript
- Той е оптимален по отношение на броя на записите в паметта. то минимизира броя на записите в паметта за сортиране (Всяка стойност или се записва нула пъти, ако вече е в правилната си позиция, или се записва веднъж в правилната си позиция.)
- Базира се на идеята, че масивът, който трябва да се сортира, може да бъде разделен на цикли. Циклите могат да бъдат визуализирани като графика. Имаме n възли и ребро, насочено от възел i към възел j, ако елементът с i-ти индекс трябва да присъства на j-ти индекс в сортирания масив.
Цикъл в arr[] = {2 4 5 1 3}
Цикъл в arr[] = {2 4 5 1 3}- Цикъл в arr[] = {4 3 2 1}
Цикъл в arr[] = {4 3 2 1}
Ние един по един разглеждаме всички цикли. Първо разглеждаме цикъла, който включва първия елемент. Намираме правилната позиция на първия елемент и го поставяме на правилната позиция, да речем j. Разглеждаме старата стойност на arr[j] и намираме правилната й позиция, продължаваме да правим това, докато всички елементи от текущия цикъл не бъдат поставени на правилната позиция, т.е. не се върнем към началната точка на цикъла.
fcfs
Псевдокод:
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
По-долу е изпълнението на горния подход:
CPP// C++ program to implement cycle sort #include using 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; }
Java // 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)>
Python3 # 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)>
C# // 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
JavaScript <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
Анализ на времевата сложност :
- Най-лошият случай: O(n2)
- Среден случай: O(n2)
- Най-добър случай: O(n2)
Помощно пространство: О(1)
- Сложността на пространството е постоянна, защото този алгоритъм е на място, така че не използва допълнителна памет за сортиране.
Метод 2: Този метод е приложим само когато дадени стойности на масив или елементи са в диапазона от 1 до N или 0 до N. При този метод не е необходимо да въртим масив
Подход: Всички дадени стойности на масива трябва да са в диапазона от 1 до N или от 0 до N. Ако диапазонът е от 1 до N, тогава правилната позиция на всеки елемент от масива ще бъде индексът == стойност-1, т.е. означава, че при 0-та стойност на индекса ще бъде 1, по същия начин при 1-ва позиция на индекса стойността ще бъде 2 и така нататък до n-та стойност.
как да изтеглите видеоклипове от youtube vlc
по подобен начин за стойности от 0 до N правилната индексна позиция на всеки елемент от масива или стойност ще бъде същата като неговата стойност, т.е. при 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++#include using 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; }
Java // 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 solunke
Python # 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)
C# using 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 // 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
Анализ на времевата сложност:
- Най-лошият случай: O(n)
- Среден случай: O(n)
- Най-добър случай: O(n)
Помощно пространство: О(1)
Предимство на цикличното сортиране:
- Не е необходимо допълнително съхранение.
- алгоритъм за сортиране на място.
- Минимален брой записи в паметта
- Цикълното сортиране е полезно, когато масивът се съхранява в EEPROM или FLASH.
Недостатък на Cycle sort:
- Не се използва предимно.
- Има повече времева сложност o(n^2)
- Нестабилен алгоритъм за сортиране.
Приложение на сортиране на цикли:
- Този алгоритъм за сортиране е най-подходящ за ситуации, при които операциите за запис или размяна на паметта са скъпи.
- Полезно за сложни проблеми.