智能车制作

标题: 算法基础部分-C语言表示 [打印本页]

作者: septstrings    时间: 2011-6-3 13:12
标题: 算法基础部分-C语言表示
[attach]7707[/attach]
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,           字符串排序


下面省略,放在附件
作者: septstrings    时间: 2011-6-3 13:13
由于发帖有长度限制,所以说放在了附件里面,只选择了第六个写出了代码……
作者: liuli    时间: 2011-6-6 18:19

作者: flyakiss    时间: 2011-6-11 00:41

作者: oyangsaio    时间: 2011-7-11 11:52
谢谢你们
作者: 723cheng    时间: 2011-9-23 11:26
thank you
作者: char_rp    时间: 2012-2-23 15:07
:victory:
作者: quanwenbin    时间: 2012-3-10 08:04

作者: erchowyo    时间: 2012-3-10 11:14

作者: czrushman    时间: 2012-4-10 20:39
这种东西都发     服了
作者: drh007    时间: 2012-4-23 23:42
打不开
作者: 梁小龙    时间: 2013-3-8 12:40
谢了
作者: xinquan456    时间: 2013-3-11 19:47
看看
作者: ╘记得↘→开朗    时间: 2013-3-12 10:42

作者: 飞一般的速度    时间: 2013-3-12 10:43

作者: 尘心远    时间: 2013-3-28 22:26
感谢楼主的无私分享啊  




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2