ソートアルゴリズム。 CのGnomeソート

ソートアルゴリズム。 それらは多くはありませんが、少数ではありません。 よく使用されますが、必要なものはありません。 私の記憶とユーザーの記憶の両方を更新するために、これらのアルゴリズムを確認することにしました。 そして、めったに使用されないGnomeソートアルゴリズム(gnomeソート)から始めます。



公式著者(Dick Grun)によると、gnomeソートアルゴリズムは、植木鉢をソートしたノームによって開発されました。 本当かどうかは分からないが、このアルゴリズムは、特に初心者にとっては非常に簡単だ。 実際、アルゴリズムは隣接するポットを比較し、それらが正しい順序であれば、配列の次の要素に進み、そうでなければ、それらを再配置して前のものに移動します。 前の要素はありません-前進し、次の要素はありません-それで終わりです。 最初は、配列の2番目の要素にあります。



Cで実装を始めましょう。 私は誰も配列の入力と出力に問題がないと思う:

#include <stdio.h> #include <stdlib.h> size_t n = 0; //    long *arr = NULL; //   void Read() { size_t i; printf("Array size: "); scanf("%u", &n); arr = (long*)calloc(n, sizeof(long)); printf("Array: "); for (i = 0; i < n; i++) { scanf("%d", &(arr[i])); } } void Do() { //  } void Write() { size_t i; printf("Result: "); for (i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } void main() { Read(); Do(); Write(); }
      
      







したがって、ソート自体。 最初に、size_t型のカウンターiを1に初期化します。 条件i <nでwhileループを記述します。

 void Do() { //  size_t i = 1; while (i < n) { } }
      
      





今ループ。 最初にいる場合は、先に進みます(if(i == 0)i = 1;)。 最後にいる場合は、何も書かないでください。 ループ条件が機能します。 この要素が前の要素と同じかそれよりも大きい場合は、先に進みます。 別のケースでは、要素を交換して戻ります。



ソートのためのトータルレディプログラム:

 #include <stdio.h> #include <stdlib.h> size_t n = 0; long *arr = NULL; void Read() { size_t i; printf("Array size: "); scanf("%u", &n); arr = (long*)calloc(n, sizeof(long)); printf("Array: "); for (i = 0; i < n; i++) { scanf("%d", &(arr[i])); } } void Do() { //  size_t i = 1; //  while (i < n/*    */) { if (i == 0) { i = 1; } if (arr[i-1] <= arr[i]) { ++i; //   } else { //   long tmp = arr[i]; arr[i] = arr[i-1]; arr[i-1] = tmp; //   --i; } } } void Write() { size_t i; printf("Result: "); for (i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } void main() { Read(); Do(); Write(); }
      
      






All Articles