智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5190|回复: 15
打印 上一主题 下一主题

算法基础部分-C语言表示

  [复制链接]

11

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1434
威望
572
贡献
432
兑换币
0
注册时间
2011-3-1
在线时间
215 小时
跳转到指定楼层
1#
发表于 2011-6-3 13:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

C基础算法(个人整理版)

2011年5月,与WC和蓝总同去图书馆,突有此念头,故进行问题搜集并编写整理如下。部分代码参考或部分节选于网友程序。此为20个比较基础的,在各类C教程后习题中常见到的,后续将补充相关专业算法。

    2011年5月,SeptStringS!



1,           两个值互换的问题

2,           计算某年是不是闰年


3,           冒泡法排序

4,           选择排序法

5,           插入排序法

6,           快速排序法

这个好难……弄了好久……不断修改……还是出问题了,后来参考了网上的一个程序……大体思想是,拿一个数作为基准,分别从右到左和从左到右进行扫描(假定从小到大排列),那么比基准小的就移动到基准的位置上,比基准大的,就移到先前操作空出来的右侧的位子上……额,这个说的有点乱,下面是程序,添加了许多辅助语句,直接运行分析已经很直观了!!就不多写了,免得自己也纠结了。

#include "stdio.h"

//实现从小到大排序

int Partition(int r[],int i,int j)

{

         int pivot,m;

         pivot = r; //把区间第一个数作为比较的基准

         printf("\n本次操作区间[=,=]\n",i,j);

         while(i < j)

         {

                   ///////////////////////

                   //从区间两端交替向中间扫描,直至i=j为止

                   while(i < j&&r[j] >= pivot)

                   {

                            j--; //如果没有找到比r小的数,那么一直减小j,向左扫描

                   }

                   if(i < j)

                   {

                            r = r[j];//这里交换找到的第一个比r小的数

                            i++;

                   }

                   ///////////////////////

                   //输出向左扫描换数操作后的数组当前值

                   printf("由右向左扫描一次:\n");

                   for(m = 0;m < 8;m++)

                   {

                            printf("}",r[m]);

                   }

                   printf("��",i,j);

                   printf("\n");

                   ///////////////////////

                   while(i < j&&r <= pivot)

                   {

                            i++;//如果没有找到比r大的数,那么一直增大i,向右扫描

                   }

                   if(i < j)

                   {

                            r[j] = r; //这里交换找到的第一个比r大的数

                            j--;

                   }

                   ///////////////////////

                   //输出向右扫描换数操作后的数组当前值

                   printf("由左向右扫描一次:\n");

                   for(m = 0;m < 8;m++)

                   {

                            printf("}",r[m]);

                   }

                   printf("��",i,j);

                   printf("\n");

         } //endwhile

         r = pivot; //将基准值移动到当前所指数组位,以保证交换后不遗漏  

         return i;//返回推进后的i值,作为下次分区间的标准

}

void QuickSort(int r[],int low,int high)

{

         int pivotpos; //把区间分成两部分,pivotpos是左区间和右区间的分割位

         if(low < high)//保证区间存在,也就是区间长度大于1时候才进行排序操作

         {

                   pivotpos = Partition(r,low,high); //这是划分区间并移动数据的操作

                   QuickSort(r,low,pivotpos - 1);//对左区间递归排序

                   QuickSort(r,pivotpos + 1,high);//对右区间递归排序

         }

}

main()//这一部分没有什么难度,就是数组输出和子函数调用

{

         int a[8]={32,13,53,6,45,87,54,23},i;

         ///////////////////////

         printf("初始数据\n");

         printf("   a[0]   a[1]   a[2]   a[3]   a[4]   a[5]   a[6]   a[7]\n");

         for(i = 0;i < 8;i++)

         {

                   printf("}",a);

         }

         printf("       i      j");

         printf("\n");

         printf("\n");

         ///////////////////////

         QuickSort(a,0,7);

         ///////////////////////

         printf("结果数据\n");

         for(i = 0;i < 8;i++)

         {

                   printf("}",a);

         }

         printf("\n");

         ///////////////////////

}

7,           字符串排序


下面省略,放在附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

11

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1434
威望
572
贡献
432
兑换币
0
注册时间
2011-3-1
在线时间
215 小时
2#
 楼主| 发表于 2011-6-3 13:13:14 | 只看该作者
由于发帖有长度限制,所以说放在了附件里面,只选择了第六个写出了代码……
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
QQ
威望
238
贡献
43
兑换币
0
注册时间
2010-11-18
在线时间
2 小时
3#
发表于 2011-6-6 18:19:27 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
QQ
威望
241
贡献
27
兑换币
0
注册时间
2010-12-13
在线时间
10 小时
4#
发表于 2011-6-11 00:41:40 | 只看该作者
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
QQ
威望
249
贡献
51
兑换币
0
注册时间
2011-3-18
在线时间
3 小时
5#
发表于 2011-7-11 11:52:46 | 只看该作者
谢谢你们
回复 支持 反对

使用道具 举报

2

主题

105

帖子

0

精华

金牌会员

CROSS

Rank: 6Rank: 6

积分
2059
威望
840
贡献
959
兑换币
160
注册时间
2010-12-20
在线时间
130 小时
6#
发表于 2011-9-23 11:26:06 | 只看该作者
thank you
回复 支持 反对

使用道具 举报

1

主题

61

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2421
威望
1224
贡献
555
兑换币
191
注册时间
2012-2-15
在线时间
321 小时
毕业学校
111
7#
发表于 2012-2-23 15:07:33 | 只看该作者
:victory:
回复 支持 反对

使用道具 举报

1

主题

48

帖子

0

精华

高级会员

Rank: 4

积分
639
威望
387
贡献
106
兑换币
25
注册时间
2012-2-6
在线时间
73 小时
毕业学校
hitwh
8#
发表于 2012-3-10 08:04:12 | 只看该作者
回复 支持 反对

使用道具 举报

5

主题

167

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4628
威望
879
贡献
225
兑换币
100
注册时间
2012-2-18
在线时间
3930 小时
毕业学校
神马
9#
发表于 2012-3-10 11:14:34 | 只看该作者
回复 支持 反对

使用道具 举报

40

主题

489

帖子

0

精华

跨届大侠

我很水

Rank: 10Rank: 10Rank: 10

积分
10739

优秀会员奖章活跃会员奖章论坛元老奖章资源大师奖章

QQ
威望
3117
贡献
7282
兑换币
5
注册时间
2010-10-20
在线时间
170 小时
10#
发表于 2012-4-10 20:39:41 | 只看该作者
这种东西都发     服了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 22:37 , Processed in 0.254520 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表