C語言冒泡算法
#include<stdio.h>
#include<conio.h>
void main()
{
int a[10],i,j,t;
printf("Please input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<10;i++)
printf("%d",a[i]);
getch();
}
你看看這個,是用C編出來的在wintc下,vc,vs下均通過
前輩們幫忙解釋一下這個冒泡排序的每個語句的意思(標注在每句后
意料之中。單看程序,不實際跑幾遍是很難完全理解的。
void main prbub(p,n)
int n;double p[];
{int m,k,j,i;
double d;
k=0;m=n-1;
while (k<m)
{j=m-1;m=0;
for(i=k;i<=j;i++) //從k開始,直到最后
if(p[i]>p[i+1]) //如果順序不對
{d=p[i];p[i]=p[i+1];p[i+1]=d;m=i;} //兩個數字對換位置
j=k+1;k=0; //設初值
for(i=m;i>=j;j--) //從m開始往前,直到j
if(p[i-1]>p[i]) //如果順序不對
{d=p[i];p[i]=p[i+1];p[i+1]=d;k=i;} //兩個數字對換位置
}
return;
}
1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為*的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最后任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。
(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對于每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最后,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。
C語言冒泡算法
最簡單的排序方法是冒泡排序方法。
這種方法的基本思想是,將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。在冒泡排序算法中我們要對這個“氣泡”序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,并時刻注意兩個相鄰的元素的順序是否正確。如果發現兩個相鄰元素的順序不對,即“輕”的元素在下面,就交換它們的位置。顯然,處理一遍之后,“最輕”的元素就浮到了最高位置;處理二遍之后,“次輕”的元素就浮到了次高位置。在作第二遍處理時,由于最高位置上的元素已是“最輕”元素,所以不必檢查。一般地,第i遍處理時,不必檢查第i高位置以上的元素,因為經過前面i-1遍的處理,它們已正確地排好序。
void doit(float* in,int count)
{
int x;
int y;
float temp;
for(y=0;y<count-1;y++)
{
for(x=1;x<count-y;x++)
{
if((*(in+x))>(*(in+x-1)))
{
temp=(*(in+x-1));
(*(in+x-1))=(*(in+x));
(*(in+x))=temp;
}
}
}
}
c語言冒泡排序法的太多不懂
1.定義了a[10]十個存儲的空間,后面賦了九個值,最后一個沒有賦也就是說用0代替,這是對的
for(i=0;i<8;i++)
for(j=0;j<8-i;j++)
你的循環中,8限制了你比較的數是8+1=9個,最后一個0沒有參加比較,還是放在數組a[9]中,如果你要0參加排序,上面的兩個8改為9
for(i=0;i<9;i++)
{
printf("%d ",a[i]);
}
這是你的打印,只打印了9個數,如果你改為i<10,則可打出最后一個0
2.因為for下面只有一個語句,就可以不用加
#include<stdio.h>
void main()
{
int a[10]={8,9,1,6,4,2,7,3,5};
int i,j,k;
for(i=0;i<8;i++)
{ //加的{
for(j=0;j<8-i;j++)
{
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}//加的}
for(i=0;i<9;i++)
{
printf("%d ",a[i]);
}
printf("\n");
getch();
}
3.
for(j=0;j<8-i;j++)
第一次i=0,即找出最大的數,這時需要比較8次(9個數)
第二次i=1時,即找第二大的數,由于最大的已經找到了,所以只需要比較8-i=7次
第三次時,只需比較剩下的7個數,即8-i=6次
。。。。
4.
a[j+1]不是a[j]+1,而是第j+1個數
j的初始值是0,也就是說j的第0個值也就是8
j+1=1,也就是說j的第1個值也就是9
比較8和9的值
類似的
j=1時,就是比較第1個值9和第j+1=2個值1了