免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1615 | 回复: 4
打印 上一主题 下一主题

[C] 帮忙解释下这段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-16 15:47 |只看该作者 |倒序浏览
《TheCProgrammingLanguage》

快速排序算法是C. A. R. Hoare于1 9 6 2年发明
的。对于一个给定的数组,从中选择一个元素(叫做分区元素),并把其余元素划分成两个子集
合—一个是由所有小于分区元素的元素组成的子集合,另一个是由所有大于等于分区元素的
元素组成的子集合。对这样两个子集合递归应用同一过程。当某个子集合中的元素数小于两个
时,这个子集合不需要再排序,故递归停止。
下面这个版本的快速排序函数可能不是最快的一个,但它是最简单的一个。在每一次划分
子集合时都选取各个子数组的中间元素。
/* qsort:以递增顺序对v[left] … v[right] 进行排序*/
void qsort( int v[], int left, int right )
{
int i, last;
void swap( int v[], int i, int j );
if ( left >= right ) /* 若数组所包含的元素数少于两个,则什么也不做*/
return;
swap( v, left, (left + right)/2 ); /* 把分区元素移到v[0] */
last = left;//从这里开始难以理解,帮我解释下吧,最好举个具体数字的例子
for ( i = left+1; i <= right; i++ ) /* 分区*/
if ( v[i] < v[left] )
swap( v, ++last, i );
swap( v, left, right ); /* 恢复分区元素*/
qsort( v, left, last-1 );
qsort( v, last+1, right );
}

/* swap:交换v[i]与v[j]的值*/
void swap( int v[], int i, int j )
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}

又交换,又递归,一头雾水!!!各位大哥帮小弟解释下,感激

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-06-16 15:57 |只看该作者

回复 #1 wheniwasyoung 的帖子

先确认你真正理解了 quick sort 的算法,所谓真正的理解,就是给你一个数组,你能用该算法在纸上一步步的将其排序,如果你能做到这个,理解上面的代码就是很简单了。

论坛徽章:
0
3 [报告]
发表于 2009-06-16 16:20 |只看该作者
或者拿个元素比较少的数据,一步一步跟着程序走下去

我个人其实也不是特别清楚算法这些东西,不过既然人家已经写好了,我用就OK了

论坛徽章:
0
4 [报告]
发表于 2009-06-16 17:09 |只看该作者
它拿中间值比较,主要是下面几行不理解
for ( i = left+1; i <= right; i++ ) /* 分区*/
if ( v[i] < v[left] )
swap( v, ++last, i );

论坛徽章:
0
5 [报告]
发表于 2009-06-16 17:15 |只看该作者
网上的一段代码,是以最后元素为分区元素
//注意,该函数是以最后一个元素p[end]为pivot。
QuickSort(int p[], int start, int end)
{
    if (start >= end) //(1)此时无需排序,所以返回。(2).1 这还保证了,如果只有2个元素时,j=end-1 =1>0
        return;
    int i = start, j = end - 1;
    int tmp;
    do
    {
        while(p[i]<p[end]){i++;}
        while(p[j]>=p[end]){j--;} //(4) 解决相等元素问题。
         if (i<j)
           swap(p[i], p[j]);
        else
           swap(p[i], p[end]);//确定pivot的准确位置。
    }
    while(i < j);
    //(3)至此完成了一趟快速排序得到:小于pivot的数 | pivot | 大于等于pivot的数

    QuickSort(p, start, i-1); //对小于pivot的数进行快速排序。
    QuickSort(p, i+1, end); //对大于等于pivot的数进行快速排序。
    //(2).2 如果i到end时,即end前的所有元素都小于pivot,会发现,i+1>end了,即递归调用时会立刻返回,所以不会发生p[i]操作越界的现象,因为根本就没机会往下走。(2).3同理。
}

找到的有用链接:
[url]http://blog.csdn.net/midgard/archive/2009/04/09/4060027.aspx[/url]
[url]http://www.cnitblog.com/liaoqingshan/archive/2008/03/19/41163.html[/url]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP