Q sort 快速排序 递归实现
int[] l_ = new int[] { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
public void Start()
{
quickSort(l_);
}
//递归实现
void quickSort(int[] _l)
{
QSort(_l, 0, _l.Length - 1);
for (int i = 0; i < l_.Length; i++)
{
Debug.LogError(l_[i]);
}
}
void QSort(int[] _l, int low, int high)
{
int pivot; //中心点
if (low < high) //住过低小于高
{
pivot = partition(_l, low, high); //第一步从列表的起始坐标 到最高坐标 进行 枢轴区分 //此时列表已经以第一个数为枢轴大小进行左右分离了
QSort(_l, low, pivot - 1); // 将极low 到 枢轴坐标之间的数据进行再次枢轴区分
QSort(_l, pivot + 1, high); // 将级枢轴坐标 到 极high之间的数据 再次 枢轴区分
} //以此类推 直至 low< high为止,此时 每个枢轴坐标都已确定好位置 并且无法细分下去
}
/// 这一步 有两个目的 1 找到枢轴标 排序后应当在列表中的位置
/// 2 与枢轴坐标相对大小 进行左右分离
int partition(int[] _l, int low, int high)
{
int pivokey;
pivokey = _l[low]; //用子表的第一个记录作 枢轴记录 P
while (low < high)
{
while (low < high && _l[high] >= pivokey) //找到最近一个比枢轴记录P小的
high--;
swep(_l, low, high); //将比枢轴记录小的记录交换到当前最小下标处
while (low < high && _l[low] <= pivokey) //找到最近一个比枢轴记录大的
low++;
swep(_l, low, high); //将比枢轴记录大的记录交换到高处 也就是上一个正好被替换的地方
} //以此循环下去 既可保证起始low 到 high 中 枢轴记录坐标P 左边都<P 右边>P
return low; //这个坐标其实就是子表第一个记录排序应当所在的位置
}
//交换位置
void swep(int[] _l, int low, int high)
{
var temp = _l[low];
_l[low] = _l[high];
_l[high] = temp;
}