サイクルソート
サイクルソート手法の複雑さ
- 時間計算量:O(n ^ 2)
- スペースの複雑さ:O(1)
入力と出力
Input: A list of unsorted data: 23 63 98 74 20 14 36 45 99 78 Output: Array before Sorting: 23 63 98 74 20 14 36 45 99 78 Array after Sorting: 14 20 23 36 45 63 74 78 98 99
アルゴリズム
cycleSort(array, size)
入力- データの配列、および配列内の総数
出力- ソートされた配列
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
例
#include<iostream> using namespace std; void swapping(int &a, int &b) { //swap the content of a and b int temp; temp = a; a = b; b = temp; } void display(int *array, int size) { for(int i = 0; i<size; i++) cout << array[i] << " "; cout << endl; } void cycleSort(int *array, int n) { for(int start = 0; start<n-1; start++) { //put array element in the correct place int key = array[start]; int location = start; for(int i = start+1; i<n; i++) { //count smaller element in the right side of key if(array[i] < key) location++; } if(location == start) //when it is in correct place go for next iteration continue; while(key == array[location]) //if same data is found increase location location++; if(location != start) swapping(array[location], key); while(location != start) { location = start; for(int i = start+1; i<n; i++) { //location to put element if(array[i] < key) location++; } while(key == array[location]) //if same data is found increase location location++; if(key != array[location]) swapping(key, array[location]); } } } int main() { int n; cout << "Enter the number of elements: "; cin >> n; int arr[n]; //create an array with given number of elements cout << "Enter elements:" << endl; for(int i = 0; i<n; i++) { cin >> arr[i]; } cout << "Array before Sorting: "; display(arr, n); cycleSort(arr, n); cout << "Array after Sorting: "; display(arr, n); }
出力
Enter the number of elements: 10 Enter elements: 23 63 98 74 20 14 36 45 99 78 Array before Sorting: 23 63 98 74 20 14 36 45 99 78 Array after Sorting: 14 20 23 36 45 63 74 78 98 99
-
ハミルトン閉路
無向グラフでは、ハミルトン経路は各頂点を1回だけ訪問する経路であり、ハミルトン閉路または回路は最後の頂点からのエッジがあるハミルトン経路です。最初の頂点に。 この問題では、グラフにハミルトン閉路が含まれているかどうかを判断しようとします。また、ハミルトン閉路が存在する場合は、その周期も印刷します。 入力と出力 Input: The adjacency matrix of a graph G(V, E). Output: The algorithm finds the Hamiltonian path of the given graph. For this case it is (0, 1
-
サイクルソート用のPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、サイクルソートの概念を使用して配列をソートする必要があります。 これはインプレースアルゴリズムであり、スワッピングはサイクルの形成によって行われます。 次に、以下の実装のソリューションを見てみましょう- 例 def cycleSort(array): writes = 0 # cycles to be rotated for cycleStart in range(0, len(array) - 1):