1. 程式人生 > >C#快速排序法

C#快速排序法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 排序法
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = {5,8,3,6,7,4,9,1,2 }; //待排序陣列
            QuickSort(arr, 0, arr.Length -
1); //呼叫快速排序函式。傳值(要排序陣列,基準值位置,陣列長度) //控制檯遍歷輸出 Console.WriteLine("排序後的數列:"); foreach (int item in arr) Console.WriteLine(item); Console.ReadLine(); } private static void QuickSort(int[] arr, int begin, int end) {
if (begin >= end) return; //兩個指標重合就返回,結束呼叫 int pivotIndex = QuickSort_Once(arr, begin, end); //會得到一個基準值下標h QuickSort(arr, begin, pivotIndex - 1); //對基準的左端進行排序 遞迴 QuickSort(arr, pivotIndex + 1, end); //對基準的右端進行排序 遞迴 } private static
int QuickSort_Once(int[] arr, int begin, int end) { int pivot = arr[begin]; //將首元素作為基準 int i = begin; int j = end; while (i < j) { //從右到左,尋找第一個小於基準pivot的元素 while (arr[j] >= pivot && i < j) { j--; //指標向前移 } arr[i] = arr[j]; //執行到此,j已指向從右端起第一個小於基準pivot的元素,執行替換 //從左到右,尋找首個大於基準pivot的元素 while (arr[i] <= pivot && i < j) { i++; //指標向後移 } arr[j] = arr[i]; //執行到此,i已指向從左端起首個大於基準pivot的元素,執行替換 } //退出while迴圈,執行至此,必定是 i= j的情況(最後兩個指標會碰頭) //i(或j)所指向的既是基準位置,定位該趟的基準並將該基準位置返回 arr[i] = pivot; return i; } } }