Chinaunix首页 | 论坛 | 博客
  • 博客访问: 463408
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: C/C++

2011-09-03 10:44:59

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。实现代码如下:

#include
#include


/*********************************************************************************

 *功能描述:快速排序算法

 *传入参数:num:需要排序的数组首地址, low:需要排序的数组起始下标 high:截止下标

 *传出参数:num:排序后的数组首地址,传入参数和传出参数空间复用,降低空间复杂度

 *返回值: 无

 **********************************************************************************/


void quick_sort(int *num, int low, int high)
{
int tmp, i, j, t;
/*把low>=high作为递归结束的条件,所以这个判断是必须的;否则递归没完没了,最终 导致段错误*/
if(low < high)
{
tmp = num[low];//用子表的第一个记录做枢轴记录
i = low;   
j = high+1;//保证后续的j=j-1的通式子的运用

while(i
{
for(i=i+1; i 的数时,直接跳出循环
{
if(num[i] >= tmp)
{
break;
}
}
for(j=j-1; j>low; j--)//从后往前扫描,当找到第一个比枢轴小的 数时,直接跳出循环
{
if(num[j] <= tmp)
{
break;
}
}
if(i
{
t = num[i];
num[i] = num[j];
num[j] = t;
}

}

/*当子表中除枢轴以外的数都划分之后,最后将枢轴记录与从后往前扫第一个比 枢轴小的数交换*/
t = num[low];
num[low] = num[j];
num[j] = t;
/*分别将枢轴前后两边的子表递归调用,完成这两个子表的*/
quick_sort(num, low, j-1);
quick_sort(num, i, high);
}
return;
}

int main(void)
{
int i;
int num[5] = {5, 4, 3, 2, 1};
printf("before:\n");
for(i=0; i<5; i++)
{
printf("num[%d]:%d\n", i, num[i]);
}
quick_sort(num, 0, 4);

printf("after:\n");
for(i=0; i<5; i++)
{
printf("num[%d]:%d\n", i, num[i]);
}

return 0;
}

阅读(1578) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~