1.需求:将一个无序的数组按从小到大的顺序排列
2.思想:众所周知交换排序中的冒泡排序的一般时间复杂度为O(n2),今天复习交换排序中的另外一种排序算法:快速排序,选取一个基准值,将数组中大于这个基准值的放到基准值一边,小的放到另外一边,然后对两边数组进行同样的操作。一般时间复杂度为O(nlog2(n))这里需要用到递归(顺便复习一下递归的概念:一个方法调用自己叫做递归。什么时候可以用递归呢?1.一个大的问题可以分解成同样的更小的问题。2有递归出口(递归何时结束的条件))
3.思路:一般选取数组的第一个值为基准值,我们要做的就是给他安个家,将他放到合适的位置。这里采用挖坑法:首先选出基准值,相当于在0位置挖了一个坑,然后从右往左找出第一个比基准值小的数取出来放到刚挖的坑里面,填了旧坑又出来新坑,然后从左往右找到第一个比基准值大的数将其填到新坑里面,当左边=右边的时候也就是找到了基准值的家了。然后采用递归分别对基准值的左边和右边做相同的操作,递归出口:当需要处理的数只有一个的时候。
4.实现:
public class Sort
{
/// <summary>
/// 待排序数组
/// </summary>
public int[] arr { get; set; }
/// <summary>
/// 快速排序
/// </summary>
/// <param name="left">指向待处理数组的起始位置</param>
/// <param name="right">指向待处理数组的结束位置</param>
public void QuickSort(int left,int right)
{
if (arr == null)
{
throw new ArgumentException("未将待排序数组对象引用设置到实例");
}
if (left < right)
{
int i = left;//记录起始位置
int j = right;//记录结尾位置
int pivot = arr[left];//基准值
while (i < j)
{
//从右往左找出第一个比基准值小的数
while (j > i && arr[j] > pivot)
j--;
//填坑
arr[i] = arr[j];
//从左往右找出第一个比基准值大的数
while (i < j && arr[i] < pivot)
i++;
//填坑
arr[j] = arr[i];
}
arr[i] = pivot;
QuickSort(left, i-1);
QuickSort(i + 1, right);
}
}
}
}
5.运行结果: