希尔排序法对一维数组排序

希尔排序(缩小增量排序),首先将整个待排序的序列分割成若干子序列,分别直接插入排序,然后再对全体记录进行插入排序.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace XESort

{

    public partial class Frm_Main : Form

    {

        public Frm_Main()

        {

            InitializeComponent();

        }

        private int[] G_int_value;//定义数组字段

        private Random G_Random = new Random();//创建随机数对象

        private void btn_sort_Click(object sender, EventArgs e)

        {

            if (G_int_value != null)

            {

                int inc;//定义一个int变量,用来确定每个有序序列的个数

                for (inc = 1; inc <= G_int_value.Length / 9; inc = 3 * inc + 1) ;//为有序序列赋值

                for (; inc > 0; inc /= 3)

                {

                    for (int i = inc + 1; i <= G_int_value.Length; i += inc)

                    {

                        int t = G_int_value[i - 1];//记录当前值

                        int j = i;//定义下一个索引

                        while ((j > inc) && (G_int_value[j - inc - 1] > t))

                        {

                            G_int_value[j - 1] = G_int_value[j - inc - 1];//交换数据

                            j -= inc;

                        }

                        G_int_value[j - 1] = t;//将下一个元素值设置为当前值

                    }

                }

                txt_str2.Clear();//清空控件内字符串

                foreach (int i in G_int_value)//遍历字符串集合

                {

                    txt_str2.Text += i.ToString() + ", ";//向控件内添加字符串

                }

            }

            else

            {

                MessageBox.Show("首先应当生成数组,然后再进行排序。", "提示!");

            }

        }

        private void btn_Generate_Click(object sender, EventArgs e)

        {

            G_int_value = new int[G_Random.Next(10, 20)];//生成随机长度数组

            for (int i = 0; i < G_int_value.Length; i++)//遍历数组

            {

                G_int_value[i] = G_Random.Next(0, 100);//为数组赋随机数值

            }

            txt_str.Clear();//codego.net/1/1/1/清空控件内字符串

            foreach (int i in G_int_value)//遍历字符串集合

            {

                txt_str.Text += i.ToString() + ", ";//向控件内添加字符串

            }

        }

    }

}

我认为这种排序对于元素较多的数组有效果.元素较少的用不到.