Gnome sort

类别:排序-交换排序
参看 维基百科的定义

Gnome sort is a sorting algorithm which is similar to insertion sort, except that moving an element to its proper place is accomplished by a series of swaps, as in bubble sort. The name comes from the supposed behavior of the Dutch garden gnome in sorting a line of flowerpots and is described on Dick Grune's Gnome sort page.

using System;
using System.Collections.Generic;

namespace Com.Colobu.Algorithm.Exchange
{
   
/// <summary>
   
/// <b>Gnome sort</b> is a sorting algorithm which is similar to insertion sort,
   
/// except that moving an element to its proper place is accomplished
   
/// by a series of swaps, as in bubble sort.
   
/// Gnome Sort is based on the technique used by the standard Dutch Garden Gnome.
   
/// Here is how a garden gnome sorts a line of flower pots.
   
/// Basically, he looks at the flower pot next to him and the previous one;
   
/// if they are in the right order he steps one pot forward,
   
/// otherwise he swaps them and steps one pot backwards.
   
/// Boundary conditions: if there is no previous pot,
   
/// he steps forwards; if there is no pot next to him, he is done.
   
///
   
/// 平均时间复杂度:O(n^2)
   
/// Stability:Yes
   
/// </summary>
   
public class GnomeSortAlgorithm
   
{
       
public static void GnomeSort<T>(IList<T> szArray) where T : IComparable
       
{
           
int i = 1;
           
int j = 2;
           
int count = szArray.Count;
           
while (i < count)
           
{
               
if (szArray[i - 1].CompareTo(szArray[i]) < 0) //for descending sort, reverse the comparison to >=
               
{
                    i
= j;
                    j
= j + 1;
               
}
               
else
               
{
                   
Swap(szArray, i - 1, i);
                    i
= i - 1;
                   
if (i == 0)
                   
{
                        i
= j;
                        j
= j + 1;
                   
}
               
}
           
}
       
}
       
private static void Swap<T>(IList<T> szArray, int i, int j)
       
{
            T tmp
= szArray[i];
            szArray
[i] = szArray[j];
            szArray
[j] = tmp;
       
}
   
}
}


转载请注明:来自鸟窝
本文地址:http://www.colobu.com/?p=3005



0 条评论

我要留言