C#快速排序法
阿新 • • 發佈:2018-12-19
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;
}
}
}