(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ListSort : MonoBehaviour {
private int[] m_Key = { 10, 25, 10, -3, -1, 4, -100 };
// Use this for initialization
void Start()
{
QuickSort( m_Key,0,m_Key.Length -1);
for(int i =0; i< m_Key.Length; i++)
{
Debug.Log(m_Key[i]);
}
}
/* 思路 1.先找一个基数,从左边找比基数大的,右边找比基数小的
2.然后左边跟右边再次按照基数大小排序,再次循环
*/
static void QuickSort(int[] nums, int left, int right)
{
if (nums.Length <= 1)
{
return;
}
if (left < right)
{
int i = left;
int j = right;
int middle = nums[(left + right) / 2];
while (true)
{
while (i < right && nums[i] < middle) { i++; };
while (j > 0 && nums[j] > middle) { j--; };
if (i == j) break;
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
if (nums[i] == nums[j]) j--;
}
QuickSort(nums, left, i);
QuickSort(nums, i + 1, right);
}
}
}