排序算法--希爾排序(Shell Sort)_C#程序實現

排序算法--希爾排序(Shell Sort)_C#程序實現

  排序(Sort)是計算機程序設計中的一種重要操做,也是平常生活中常常遇到的問題。例如,字典中的單詞是以字母的順序排列,不然,使用起來很是困難。一樣,存儲在計算機中的數據的次序,對於處理這些數據的算法的速度和簡便性而言,也具備很是深遠的意義。算法

1.基本概念

  排序是把一個記錄(在排序中把數據元素稱爲記錄)集合或序列從新排列成按記錄的某個數據項值遞增(或遞減)的序列。數組

2希爾排序(Shell Sort)

  1959年Shell發明,第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不一樣之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。 測試

2.1算法描述

  • 先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,具體算法描述:spa

    • 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
    • 按增量序列個數k,對序列進行k 趟排序;
    • 每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長度。

2.2動態圖演示

2.3C#代碼實現希爾排序

希爾排序

 

        /// <summary>
        /// 希爾排序
        /// </summary>
        /// <param name="array"></param>
        public static int[] ShellSort(int[] array)
        {
            int length = array.Length;
            int k = 1;
            for (int h = length / 2; h > 0; h = h / 2)
            {                
                for (int i = h; i < length; i++)
                {
                    int temp = array[i];
                    if (temp.CompareTo(array[i - h]) < 0)
                    {
                        for (int j = 0; j < i; j += h)
                        {
                            if (temp.CompareTo(array[j]) < 0)
                            {
                                temp = array[j];
                                array[j] = array[i];
                                array[i] = temp;
                            }
                        }
                    }
                }
                printArray(array);
                Console.WriteLine("" + (k++) + ""+" 增量"+h);
            }
            return array;
        }

打印數組

 1         /// <summary>
 2         /// 打印數組
 3         /// </summary>
 4         /// <param name="array"></param>
 5         private static void printArray(int[] array)
 6         {
 7             if (array == null || array.Length <= 0)
 8             {
 9                 return;
10             }
11             for (int i = 0; i < array.Length; i++)
12             {
13                 Console.Write("["+array[i]+"]"+",");
14             }
15         }

測試代碼:

1             //希爾排序
2             int[] arrayTest4 = new int[] { 9, 8, 5, 6, 7, 4, 3, 2, 1 };
3             Console.WriteLine("\n------------原數組--------------");
4             printArray(arrayTest4);
5             Console.WriteLine("\n------------希爾排序--------------");
6             int[] resultArray4 = ShellSort(arrayTest4);
7             Console.WriteLine("排序結果:");
8             printArray(resultArray4);

運行結果:

相關文章
相關標籤/搜索