一个冒泡排序算法,问问哪个方法最优!
要求就是一串数,用冒泡法由小到大排列,附加要求就是,前面已经是顺序排列好的就不需要去比较了!
以5个数为例 法一 :
#include <stdio.h>
void main()
{
int a[5],i,j,k,t,m;
k=0;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=0;i<5;i++)
{
for(j=4;j>=k;j--)
{
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
m=j;
}
}
k=m;
}
for(i=0;i<5;i++)
printf("%d",a[i]);
}
法二:
#include <stdio.h>
void main ()
{
int lenth=5;
int n=0,temp,i;
int a[5];
for(i=0;i<5;i++)scanf("%d",&a[i]);
while(!((a[0]<a[1])&&(a[1]<a[2])&&(a[2]<a[3])&&(a[3]<a[4])))
{
for(i=0;i<4;i++)
{
if (a[i]>a[i+1])
{
n=i;
break;
}
}
for(i=4;i>n;i--)
{
if(a[i]<a[i-1])
{
temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
}
}
continue;
}
for(i=0;i<5;i++)
printf("%d",a[i]);
}
如果还有其他更优算法望指教,谢了!
[解决办法]
加个标记就可以了
[解决办法]
- C/C++ code
void BubbleSort (int a[], int n){ int exchange,bound; int temp; int j=0; exchange = n-1; while( exchange ) { bound = exchange; exchange = 0; for( j = 0 ;j < bound;j++ ) { if(a[j] > a[j+1] ) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; exchange = j; } } }}
[解决办法]
void bubble(int *pa,int n)
{
int i,j,temp,flag;
for(i=0;i<n-1;i++)
{
flag=1;
for(j=n-1;j>i;j--)
if(pa[j-1]>pa[j])
{
temp=pa[j-1];
pa[j-1]=pa[j];
pa[j]=temp;
flag=0;
}
if(flag==1)
break;
}
你可以设置一个flag 如果前面的都有序了,就可以早点结束了。
[解决办法]
- C/C++ code
#include <stdio.h>#include <string.h>#define TEST_NUM 16void BubbleSort(float *fInOut, int nLen){ int isSorted = 0; do { float temp; isSorted = 1; --nLen; for (int i = 0; i < nLen; i++) { if (fInOut[i] > fInOut[i + 1]) { isSorted = 0; temp = fInOut[i]; fInOut[i] = fInOut[i + 1]; fInOut[i + 1] = temp; } } } while (!isSorted);}void main(int argc, char *argv[]){ float arr[TEST_NUM] = {1.0, 2.0, 0.5}; //memset(arr, 0, sizeof(arr)); for (int i = 0; i < TEST_NUM; i++) { printf("%f\n", arr[i]); } BubbleSort(arr, TEST_NUM); for (i = 0; i < TEST_NUM; i++) { printf("i=%d\t%f\n", i, arr[i]); }}
[解决办法]
- C/C++ code
#define SWAP(a,b) ((a^)=(b^)=(a^)=(b^))void bubble(char a[], int len) { int i = 1,j,tmp; bool change; do { change = false; for(j=0; j<len-i; j++) { if(a[j] > a[j+1]) { SWAP(a[j],a[j+1]); change = true; } } i++; } while (i<len && change==true);}