快速排序:把集合的第一个元素进行标记(key),设定两个移动标记,分别向后/向前移动,把比key大的数据放在key右边,把比key小的数据放到key左边
重复执行此方法,到所有元素排序完成
过程:
1.j 向前移动,找到第一个小于 key 的元素 -> array[i] array[j]互换
2. i 向后运动,找到第一个大于key 的元素 ->array[i] array[j]元素互换
3.重复上面两个过程直到i=j 结束
时间复杂度:O(n*log2n) 稳定性:不稳定 空间复杂度:O(log2n)~O(n)
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[] a = new int[5] { 1, 5, 7, 6, 3 };
Sort(a, 0, a.Length - 1);
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine("{0}", a[i]);
}
}
static void Sort(int [] arr,int low,int high)
{
if (low > high) { return; }
int first = low;
int last = high;
int key = arr[first];
while (first < last)
{
//最后游标向前移动
while (first < last && arr[last] > key)
{
--last;
}
arr[first] = arr[last];
//最前游标向后移动
while (first<last&&arr[first]<key)
{
++first;
}
arr[last] = arr[first];
}
//上面while退出:证明first 和last 重合
arr[first] = key;
//通过递归调用确定元素位置
Sort(arr, low, first - 1);
Sort(arr, first + 1, high);
}
}
}