プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

サイクルソート


サイクルソートは、インプレースソートアルゴリズムです。また、比較ベースの並べ替えであり、他のインプレース並べ替え手法で効率的です。ソートタスクを実行するためのメモリ書き込みの最小数を見つけます。

サイクルソート手法の複雑さ

  • 時間計算量: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. ハミルトン閉路

    無向グラフでは、ハミルトン経路は各頂点を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

  2. サイクルソート用のPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、サイクルソートの概念を使用して配列をソートする必要があります。 これはインプレースアルゴリズムであり、スワッピングはサイクルの形成によって行われます。 次に、以下の実装のソリューションを見てみましょう- 例 def cycleSort(array):    writes = 0    # cycles to be rotated    for cycleStart in range(0, len(array) - 1):