公式著者(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(); }