以前上课就听老师讲过快速排序在面试过程中很重要,尽管接触计算机的时间不长,但现在感觉对代码已经有了一种特殊的感情。写算法就要分析它的时间复杂度,空间复杂度(但我高等数学就没好好思考过,不是没学,是没好好思考怎么学,不过现在我改变了,知道怎么学了),说实话,以前老师将快排的时候似乎懂得,但自己从来没有好好亲身实践过,今天好好实践了一下,反正呢,觉得代码撸好了,知道代码每一句意思会让计算机做什么,最终让它跑出来,真爽。下面看具体代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 快速排序2
{
public class Quicksort
{
public int Partition(int[] list, int low, int high)
{
int pivotkey = list[low];
while (low < high)
{
while (low<high&&list[high] >= pivotkey) --high; //快排的核心代码
list[low] = list[high];
while (low<high&&list[low] <= pivotkey) ++low;list[high] = list[low];
}
list[low] = pivotkey;
return low;
}
public void Qsort(int[] list, int low, int high) //声明一个方法对数组序列进行快排
{
if (low < high)
{
int key = Partition(list, low, high);
Qsort(list, low, key - 1); //递归调用
Qsort(list, key + 1, high);
}
}
class Program
{
static void Main(string[] args)
{
int[] iArry = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };
Quicksort ii = new Quicksort();
ii.Qsort(iArry, 0, iArry.Length - 1);
for (int i = 0; i < iArry.Length; i++)
Console.Write("{0} ", iArry[i]);
}
}
}
时间复杂度:平均情况下为O(nlog2n);
空间复杂度分析:快速排序是递归的,执行时需要有一个栈来存放相应的数据。最大递归调用次数与递归树的深度一致,所以最好情况下的空间复杂度为O(log2n),最坏情况为O(n)
个人总结:写这个代码对我的收获是第一理解了快排过程及代码;
第二,是对核心代码的理解
while (low < high)
while (low<high&&list[high] >= pivotkey) --high; //快排的核心代码
list[low] = list[high];
while (low<high&&list[low] <= pivotkey) ++low;list[high] = list[low];
}
为何这门说呢,首先呢,外层有一个while循环,内层有两个while循环,我想说的是条件low<high,刚开始,我自认为外层while有一个low<high,内层while就可以省略,然而并不是这样,会造成数组越界。