1. 程式人生 > >學過的演算法中最快捷——快速排序法

學過的演算法中最快捷——快速排序法

<strong style="font-size:24px;"> </strong><span style="font-size:14px;">/// <summary>
        /// 快速排序法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //雜湊錶轉整數陣列
            int[] s = hs.ToArray();
            DateTime time1 = DateTime.Now;

            int low=0;                 //記錄目標陣列的起始位置
            int high=s.Length-1;   //記錄目標陣列的結束位置

            QuickSortFunction(s, low, high);

            DateTime time2 = DateTime.Now;
            textBox4.Text = DateDiff(time1, time2);

            for (int i = listBox1.Items.Count - 1; i >= 0; i--)
            {
                listBox1.Items.RemoveAt(i);
            }
            for (int i = 0; i < s.Length; i++)
            {

                this.listBox1.Items.Add(s[i]);
            }
        }


         /// <summary>
         /// 快速排序過程
         /// </summary>
         /// <param name="array">陣列</param>
         /// <param name="low">低位目標陣列下標</param>
         /// <param name="high">高位目標陣列下邊</param>
        private static void QuickSortFunction(int[] array, int low, int high)
         {
                 int keyValuePosition;   //記錄關鍵值的下標
 
                 //當傳遞的目標陣列含有兩個以上的元素時,進行遞迴呼叫。(即:當傳遞的目標陣列只含有一個元素時,此趟排序結束)
                 if (low < high) 
                 {
                     keyValuePosition = keyValuePositionFunction(array, low, high);  //獲取關鍵值的下標(快排的核心)
 
                     QuickSortFunction(array, low, keyValuePosition - 1);    //遞迴呼叫,快排劃分出來的左區間
                     QuickSortFunction(array, keyValuePosition + 1, high);   //遞迴呼叫,快排劃分出來的右區間
                 }
         }

        /// <summary>
        /// 找出關鍵值位置
        /// </summary>
        /// <param name="array">陣列</param>
        /// <param name="low">低位下標</param>
        /// <param name="high">高位下標</param>
        /// <returns>關鍵值下標</returns>
        private static int keyValuePositionFunction(int[] array, int low, int high)
         {
             int i = low;        //記錄目標陣列的起始位置(後續動態的左側下標)
             int j = high;      //記錄目標陣列的結束位置(後續動態的右側下標)
 
             int keyValue = array[low];  //陣列的第一個元素作為關鍵值
             int temp;
 
             //當 (左側動態下標 == 右側動態下標) 時跳出迴圈
             while (i< j)
             {
                 while (i < j && array[j] > keyValue)  //必須先從右邊開始,逐漸向左移動,直至找到<=keyValue的下標
                 {
                     j--;
                 }
                 while (i < j && array[j] <= keyValue)  //從左邊開始,直至找到>=keyValue的下標
                 {
                     i++;
                 }
                 if(i < j)  //如果leftIndex < rightIndex,則交換左右動態下標所指定的值;當leftIndex==rightIndex時,跳出整個迴圈
                 {
                     temp = array[i];
                     array[i] = array[j];
                     array[j] = temp;
                 }
             }
 
             //當左右兩個動態下標相等時(即:左右下標指向同一個位置),此時便可以確定keyValue的準確位置
             temp = keyValue;
             if (temp < array[j])   //當keyValue < 左右下標同時指向的值,將keyValue與rightIndex - 1指向的值交換,並返回rightIndex - 1
             {
                 array[low] = array[j - 1];
                 array[j - 1] = temp;
                 return j - 1;
             }
             else //當keyValue >= 左右下標同時指向的值,將keyValue與rightIndex指向的值交換,並返回rightIndex
             {
                 array[low] = array[j];
                 array[j] = temp;
                 return j;
             }
         }
    </span>


總結: