算法武林大会(不是比拼,是相互学习)

我是小数位 2010-10-29 10:44:54
算法是程序的灵魂,要成为出色的程序员,必然要熟练运行各种算法!
算法的特性:有穷性,确定性,有效性,输入,输出
算法分类:可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法。

本人先在此露丑,最简单算法!排序算法中的
冒泡排序(起泡排序)法的基本思想是:对于一个待排序的序列(假设按升序排序),从左向右依次比较相邻的两个数,如果左边的数大,则交换两个数以使右边的数大。这样比较、交换到最后,数列的最后一个数则是最大的。然后在对剩余的序列进行相同的操作。这个操作过程被称为一次起泡。(是常用算法之一)
一次起泡的操作只能使数列的最右端的数成为最大者。对于10个数而言,需要9次这样的起泡过程。

一:原算法

int main()
{
int i,j,k,a[10];
printf("Please input 10 integers:\n"); /*输入十个数*/
for(i=0;i<10;i++)
scanf("%d",&a[i]); /*读放数据*/
for(i=0;i<9;i++) /* 冒泡法排序 */
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{
k=a[j];/* 交换a[i]和a[j] */
a[j]=a[j+1];
a[j+1]=k;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}

二:改进算法

#include "stdio.h"
int main()
{
int i,j,k,flag;
int a[10];
printf("Please input 10 integers:\n"); /*输入10个数*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);/*读入数据*/
for(i=0;i<9;i++) /* 冒泡法排序 */
{
flag=1;
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1]) /*前面的大于后面的交换*/
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
flag=0;
}
if(flag) break;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}

分析:其中i=0时:
j从0开始a[0],a[1]比较大小,把其中的较大者给a[1],然后j++,a[1]和a[2]再比较,再把两者中的
较大者给a[2],这样a[0],a[1],a[2]中的最大者已经交换到a[2]中,这样继续直到j=10-i-1=9这样
a[9]中的为10个数中的最大数。
再从I=1开始,进入第二轮,以此类推。改进算法中,FLAG是标志,如果值没变,即节省时间,提前结束算法!

...全文
167 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx_616_at_yeah_net 2010-10-29
  • 打赏
  • 举报
回复

#include <stdio.h>

#define N 10

// 写写代码来解烦
//
void SortBubble(int* pArra, int nArraSize)
{
register int i;
register int nExChange; // nExChange = 0;
register int nSize = nArraSize;

do {
--nSize;
for( nExChange = i = 0; i < nSize; ++i )
{
if( pArra[i] > pArra[i+1] )
{
pArra[i] ^= pArra[i+1] ^= pArra[i] ^= pArra[i+1];
++nExChange; // nExChange = 1;
}
}
} while( nSize && nExChange );

}

int main(void)
{
int a[N] = {8, 7, 5, 3, 2, 1, 0, 4, 6, 9};
int i;

SortBubble(a, N);

for(i = 0; i<N; ++i)
{
printf("%d ", a[i]);
}

getchar();

return 0;
}
Csuxiaowu 2010-10-29
  • 打赏
  • 举报
回复
void BubbleSort_Three(int a[],int length)
{
int temp=0;
int exchanged=0;
int last=length-1;
int m=0;
for(int i=length; i>1; --i)
{
exchanged=0;
m=last;
cout<<"last----"<<last<<endl;;
for(int j=1; j<=m; ++j)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
exchanged=1;
last=j;
cout<<"last=j---"<<last<<endl;
}
}
if(exchanged!=1)
{
return;
}
}
}
elegant87 2010-10-29
  • 打赏
  • 举报
回复

#include "stdio.h"
int main()
{
int i,j,k,flag=1;
int a[10];
printf("Please input 10 integers:\n"); /*输入10个数*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);/*读入数据*/
for(i=0;i<9 && flag==1;i++) /* 冒泡法排序 */
{
flag=1;
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1]) /*前面的大于后面的交换*/
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
flag=0;
}
//if(flag) break;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}
赵4老师 2010-10-29
  • 打赏
  • 举报
回复
请使用测试驱动编程
过去的我 2010-10-29
  • 打赏
  • 举报
回复
顶了 回复内容太短了!
我是小数位 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ayw215 的回复:]
不错!lz加油!
[/Quote]呵呵,謝謝,只是希望大家在此列出自己的算法思想,供在家此學習!一起成長,我太苯了,以前在學校沒學好!
ayw215 2010-10-29
  • 打赏
  • 举报
回复
不错!lz加油!
JackPan 2010-10-29
  • 打赏
  • 举报
回复
不错的思路,学习中
我是小数位 2010-10-29
  • 打赏
  • 举报
回复
既然沒人願意露一手!都有所保留!那我就結帖了!
lx_616_at_yeah_net 2010-10-29
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <assert.h>

#define N 10

void SortBubble(int* pArra, int nArraSize)
{
register int i;
register int nExChange; // nExChange = 0;
register int nSize = nArraSize;

assert( pArra && (nArraSize > 0) ); // 检查

do {
--nSize;
// nExChange = 0;
for( nExChange = i = 0; i < nSize; ++i )
{


更正一下,少了检查~
我是小数位 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lx_616_at_yeah_net 的回复:]
C/C++ code

#include <stdio.h>

#define N 10

// 写写代码来解烦
//
void SortBubble(int* pArra, int nArraSize)
{
register int i;
register int nExChange; // nExChange = 0;
register……
[/Quote]UP,不錯!

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧