初学者视角 排序之快速排序法(c语言实现)

快速排序是在实践中最快的已知的排序算法,之所以特别快是因为算法精炼并且高度内部循环,该算法也使用到了递归的运用.

代码实现如下:

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左边和右边的元素进行排序,并且每次都能确定下来一个元素的位置,如此,我们也就完成了排序。

本文仅仅只是带大家简单地理解一下快速排序的意思,具体的许多细节都没有讲到(关于选取枢纽元等等)。如有疏忽错误,欢迎指正!

                                                             

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值