冒泡演进优化
要点:相邻两两相比,每次循环将选择最大(小)。类气泡
void bubble(int a[],int n)
{
int tmp;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
//两个数交换有多种方法
tmp = a[j];
a[j] = a[j+1];
a[j] = tmp;
}
}
}
}
int main()
{
int arr[] = {3,5,5,7,2,8,4};
bubble(arr,sizeof(arr)/sizeof(arr[0]));//注意:求数组的元素个数
return 0;
}
优化1
若无交换则已排序
void bubble1(int a[],int n)
{
int tmp,flag;
for(int i=0;i<n-1;i++)
{
flag = 0;
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
flag = 1;
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
if(flag == 0)
break;
}
}
优化2就是
记录交换的最后位置,则后面的无交换则为有序,并把最后的位置作为下次结束位置
可以与优化1类似 优化1是整体看,优化2是部分
void bubble2(int a[],int n)
{
int tmp,k,flag=n-1;
for(int i=0;i<flag;i++)
{
k = flag;
flag = 0;
for(int j=0;j<k;j++)
{
if(a[j]>a[j+1])
{
flag = j;
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}