學過的演算法中最快捷——快速排序法
阿新 • • 發佈:2018-12-29
<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>