1. 程式人生 > >C#之希爾排序

C#之希爾排序

//檔案中的資料格式為
// 1 2 3 4 5
// 1 2 3 5 6
using System;
using System.Text;
using System.Collections;
using System.IO;
namespace InsertSort
{
    class Program
    {
        static void Main()
        {
            string [email protected]"F://test.txt";
            StreamReader sr = new StreamReader(path, Encoding.Default);
            string temp;
            ArrayList aL = new ArrayList();
            while ((temp = sr.ReadLine()) != null)
            {
                string[] s = temp.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//根據空格區分資料
                int tempInt;
                foreach (string i in s)
                {
                    tempInt = Convert.ToInt32(i);  //string轉換成int,基本資料型別的轉換
                    aL.Add(tempInt);     //將讀取到的資料存入aL中
                }
            }
            int[] data = new int[aL.Count];  //將aL中的資料存入data方便使用排序演算法排序
            for (int i = 0; i < aL.Count; i++)
            {
                data[i] = (int)aL[i];
            }
            //希爾排序演算法
            int d = data.Length / 2;//獲取d
            while (d > 0)
            {
                for (int i = d; i < data.Length; i++) //將陣列分成data.Length/d組
                {
                    int j = i-d;  //代表此組中第一個元素的下標
                    int k = 1;
                    while (j + k * d < data.Length)    //對其中一組進行直接插入排序
                    {
                        int tem=data[j+k*d];  //看做是無序集中的第一個元素
                        for (int n = 0; n < k; n++)  //與有序集中的元素比較
                        {
                            if (tem < data[j + n * d])   
                            {
                                data[j + k * d] = data[j + n * d];
                                data[j + n * d] = tem;
                                break;
                            }
                        }
                        k++;
                    }
                }
                d /= 2;
            }
            for (int i=0;i<data.Length; i++)
            {
                Console.WriteLine(data[i]);
            }
        }
    }
}