快速排序:快
快速排序思路:
原列表 574631298
取一个元素p(第一个元素),使元素p归位;取5
并且当前列表被p分成两部分,左边都比p小,右边都比p大;列表变成 214356789
最后递归完成排序。123456789
首先完成框架
//快速排序框架
public void QuickSort(List<int> li,int left,int right)
{
int mid = 0;
if (left<right)
{
mid = Partition(li, left, right);//归位过程
QuickSort(li,left,mid-1);
QuickSort(li, mid+1, right);
}
}
接着是具体怎么归位
public int Partition(List<int> li, int left, int right)
{
int tmp = li[left];//取出最左边的元素,留一个空位
while (left<right)
{
while (left < right&&li[right]>=tmp)//从右边开始找比这个元素小的数
{
right--;//往右移
}
li[left] = li[right];//把找到的值写入左边元素的空位,那么同样右边会留下一个空位
while (left < right && li[left] <= tmp)//从左边开始找比这个元素小的数
{
left++;//往右移
}
li[right] = li[left];//把找到的值写入左边元素的空位
}
li[left] = tmp;//最后把元素填回去
return left;
}
首先测试一次归位
List<int> li = new List<int> { 5,7,4,6,3,1,2,9,8 };
Partition(li,0,li.Count-1);
StringBuilder sb = new StringBuilder();
foreach (var item in li)
{
sb.Append(item);
}
Debug.Log(sb);
ok没问题
接着测试一遍排序
OK也没问题
然后我们来分析一下快速排序的时间效率,很明显O(nlogn) (可能会开个坑简单讲讲怎么快速分析时间效率)
但是 ,出现了!,鲁迅经典但是!
还有一种最坏情况,时间效率会变成O(n2)
也就是对于{9,8,7,6,5,4,3,2,1}有序降序列表,每次归位只会移动一个元素,最后导致一共移动N次,最后时间效率变成N2
有一个很简单的解决方法就是,先在列表中取一个随机数,和第一个元素交换