没有思路或者有思路但是不清晰可以先去B站看看视频讲解,再自己画图结合断点多去感受。
代码 中有详细注释
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 快排(升序)
/// </summary>
public class Test_QuickSort : MonoBehaviour
{
int[] arr =
{
5,6,48,6,4,2,3,4
};
//入口函数
void Start()
{
//测试
QuickSort(arr, 0, arr.Length - 1);
foreach (var item in arr)
{
Debug.Log(item);
}
}
/// <summary>
/// 快排接口
/// </summary>
/// <param name="arr">排序数组</param>
/// <param name="leftIndex">左指针索引</param>
/// <param name="rightIndex">右指针索引</param>
void QuickSort(int[] arr, int leftIndex, int rightIndex)
{
//左右指针不相遇(右指针索引恒大于左指针索引)
if (leftIndex < rightIndex)
{
int middleIndex = GetMiddleIndex(arr, leftIndex, rightIndex);
//分区索引左侧排序
QuickSort(arr, leftIndex, middleIndex - 1);
//分区索引右侧排序
QuickSort(arr, middleIndex + 1, rightIndex);
}
}
/// <summary>
/// 获取分区索引
/// </summary>
private int GetMiddleIndex(int[] arr, int leftIndex, int rightIndex)
{
//获取基准值
int baseValue = arr[leftIndex];
//左右指针不相遇(右指针索引恒大于左指针索引)
while (leftIndex<rightIndex)
{
//右指针恒大于左指针 并且 右指针指向的值大于等于基准值
while (leftIndex < rightIndex && arr[rightIndex]>=baseValue)
{
//右指针变小(前移)
rightIndex--;
}
//左右指针相遇 或者 右指针指向的值小于基准值 将此值赋给左指针指向的值
arr[leftIndex] = arr[rightIndex];
//右指针恒大于左指针 并且 左指针指向的值小于等于基准值
while (leftIndex < rightIndex && arr[leftIndex]<=baseValue)
{
//左指针变大(后移)
leftIndex++;
}
//左右指针相遇 或者 左指针指向的值大于基准值 将此值赋给右指针指向的值
arr[rightIndex] = arr[leftIndex];
}
//左右指针相遇,确定分区索引(即左指针索引),将基准值赋给分区索引指向的值
arr[leftIndex] = baseValue;
//返回确定的分区索引
return leftIndex;
}
}