From 39abfd068b31301f43436bd5baad7dbaf68edc8d Mon Sep 17 00:00:00 2001 From: Zykiel <48471587+ZykielErx@users.noreply.github.com> Date: Wed, 30 Oct 2019 18:20:50 +0800 Subject: [PATCH] Added Cycle Sort (#340) Added Cycle Sort --- README.md | 1 + sorting/CycleSort.c | 106 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 sorting/CycleSort.c diff --git a/README.md b/README.md index 28f09971d..aff09d8ce 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ C - BogoSort - comb_sort - CountingSort + - Cycle Sort - gnome_sort - PartitionSort - ShellSort diff --git a/sorting/CycleSort.c b/sorting/CycleSort.c new file mode 100644 index 000000000..204647006 --- /dev/null +++ b/sorting/CycleSort.c @@ -0,0 +1,106 @@ +// Sorting of array list using cycle sort +#include +#include + +// Displays the array, passed to this method +void display(int arr[], int n){ + + int i; + for(i = 0; i < n; i++){ + printf("%d ", arr[i]); + } + + printf("\n"); + +} + +// Swap function to swap two values +void swap(int *first, int *second){ + + int temp = *first; + *first = *second; + *second = temp; + +} + +// 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++; + } + } + } + +} + + +// Driver program to test above function +int main() +{ + int n; // Size of array elements + + printf("Enter size of array:\n"); + scanf("%d", &n); // E.g. 8 + + printf("Enter the elements of the array\n"); + int i; + int arr[n]; + for(i = 0; i < n; i++){ + scanf("%d", &arr[i] ); + } + + printf("Original array: "); + display(arr, n); + + cycleSort(arr, n); + printf("Sorted array: "); + display(arr, n); + + return 0; +}