- 在说快速排序之前我们先要了解递归。
递归,按照通俗易懂的理解就是自我调用。写一个自我调用的函数如下:
int defined_pow(int n,int count)
{
if(count == 0)
return 1;
else
return n*defined_pow(n,count -1);
}
这个函数的作用是求n的count次方,当count为0时,我们返回1(任何数的0次方都等于1),当count不为0时,我们先计算n的count-1次方,再讲结果与n相乘,再返回给调用它的函数。
这个函数会一直调用它自己,每次将结果多乘一个n,计数器count减少1。当count等于1的时候,n总共被乘了 count次,n^count*1,刚好是n的count次方。
通常在递归的函数中,会设置一个if语句,if语句控制递归结束的条件(否则就陷入死循环),上一个例子中,我们设置的递归结束条件是count==0,即计数器等于零。而在下面出场的快速排序算法中,我们设置的条件则是所要排序的数组的左下标大于等于右下标。
- 先来讲一下快速排序的思想:
快速排序(从小到大),指的是将数组中的第一个数base作为参考,将所有大于第一个数的元素放到第一个数的右边,同时将所有小于第一个数的元素放到第一个数的右边。这样,第一个数base就不再是数组中的第一个元素,而是被存放在了数组的中间。
此时我们再分别在base的左边和base的右边调用这个快速排序函数本身,以base为分界线,分别将base左边和base右边的数组进行递归,下标low和high分别表示最左边的元素下标和最右边的元素下标,使得比它们大的数都被存放在它们各自的右边,比它们小的数都被存放在它们各自的右边。
在左下标大于等于右下标之前,函数会一致递归调用它本身,最后的