快速排序是在实践中最快的已知的排序算法,之所以特别快是因为算法精炼并且高度内部循环,该算法也使用到了递归的运用.
代码实现如下:
void kp(int* nums, int low, int high) {
if (low < high) {
int i = low;
int j = high;
int k = nums[low];
while (i < j) {
while (i < j && nums[j] >= k)
j--;
if (i < j)
nums[i++] = nums[j];
while (i < j && nums[i] < k)
i++;
if (i < j)
nums[j--] = nums[i];
}
nums[i] = k;
kp(nums, low, i - 1);
kp(nums, i + 1, high);
}
}
基本原理解释:首先我们令k(枢纽元)等于数组的第一个元素(方便后续比较大小),当我们进行到这一步时nums[i] = k,我们要达到的目的是让所有大于nums[i]的元素都在nums[i]的右边,而小于nums[i]的元素都在nums[i]的左边,这样其实我们也就确定下来了一个元素的位置了,在观察其中的最外面的while()循环,一次外面的while()函数的作用是进行两次调换位置,并且改变i,j的大小,接下来我举一个具体的例子为了更好的理解:
例如:我们有一个数组nums[6]={6,4,9,7,3,2};其中low等于0,high为5;
i=low //i=0;
j=high //j=5;
k=nums[0] //k=6
当我们第一次进入while循环:while (i < j && nums[j] >= k)
j--;
执行完这个语句,那我们就从右往左找到了第一个比k小的数,且此 时 i<j;(i=0,j=5);
if (i < j)
nums[i++] = nums[j];
执行完这个语句,使nums[i]=nums[j];即nums[0]=2;并且此时i++;使i=1;
while (i < j && nums[i] < k)
i++;
执行完这个语句,那我们就等于是从左往右找到了第一个比 k 大的 的数,此时i=2;
if (i < j)
nums[j--] = nums[i];
执行完这个语句,即nums[5]=nums[2]=9;j=4;
至此,我们完成了第一次的while()循环,此时数组nums[6]={2,4,9,7,3,9},k=6,i=2,j=4;
当我们第二次进入while()循环::while (i < j && nums[j] >= k)
j--;
执行此语句,那我们就从nums[4]往左找到一个比k小的数,也 就是nums[4],此时i=2,j=4;
if (i < j)
nums[i++] = nums[j];
接下来我们执行此语句,nums[2]=nums[4]=3,并且此时i=3;
while (i < j && nums[i] < k)
i++;
执行此语句之前,我们发现i=3,j=4,且nums[3]>k,所以不执 行。
if (i < j)
nums[j--] = nums[i];
执行此语句,nums[4]=nums[3]=7;并且j--,使j=3;
此时,j>i不满足。
至此我们的while()就退出了,此时再执行nums[i]=k,即nums[3]=k=6;此时nums[6]={2,4,3,6,7,9} ,
而此时我们也就确定下来了6在数组中的位置,然后我们在使用递归的方法分别对6左边和右边的元素进行排序,并且每次都能确定下来一个元素的位置,如此,我们也就完成了排序。
本文仅仅只是带大家简单地理解一下快速排序的意思,具体的许多细节都没有讲到(关于选取枢纽元等等)。如有疏忽错误,欢迎指正!