快速排序是众多算法中最具特点的算法,在方法上,和冒泡属于交换排序,但在一般情况下比冒泡排序快得多,而且他和冒泡排序刚好相反,冒泡是你有序了我是最快的,而快速排序是你有序了,我是最慢的,你越乱,我越快,所以这种奇葩排序方法的原理到底是什么呢?
我做一篇博客,总结一下这个方法。
快速排序的原理说起来很简单,就是在一组数列中,随机找一个基准数,比基准数大的,放后边,比基准数小的,放前面,这样就完成了一次快速排序,然后递归调用这个算法,就变成了快速排序。
听着很简单吧,那我们就来动手试试;
这有一组随机数组:
6 1 3 5 8 7 4 2 9 10
假如我们选择6作为基准数,那么一次快排之后,数组变成什么样了呢?
这个问题啊大家先思考,我这里把一次快排的代码写出来,在最下面可以看到答案,看看大家想的正不正确。
int QuickSort(int *arr,int left,int right)
{
if(arr == NULL || left < 0 || right > length || left > right)
{
return -1;
}
int key = arr[left];
int i = left;
int j = right;
while(i < j)
{
while(i < j && arr[j] >= key)
{
j--;
}
if(i < j)
{
arr[i] = arr[j];
i++;
}
while(i<j && arr[i] < key)
{
i++;
}
if(i<j)
{
arr[j] = arr[i];
j--;
}
}
arr[i] = key;
return i;
}
快排的解法不唯一,我记得我还看到一个使用交换函数的,每次从两边走,把左边比基准大的和右边基准小的进行交换,这样的算法更快一点,无论哪种方法都可以,最好只记一种方法,两种方法都记的话,不利于初期的理解和书写代码。
那么回到最初的问题,一次排序过后数组变成了什么样呢?
如下所示:
2 1 3 5 4 6 7 8 9 10
欢迎大家交流~