栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初学者视角 排序之快速排序法(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

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

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

                                                             

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号