第一种优化,双指针,由于冒泡排序是遍历一趟找出一个最大值(或最小值),所以可以使用双指针,遍历一次找出一个最大值和最小值
void Bubble(int arr[],int n)
{
int i,j,temp;
int left = 0;
int right = n-1;
while(left<right)
{
for(i=left;i<right;i++)
{
if(arr[i] > arr[i+1])
{
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
right--;
for(j=right;j>left;j--)
{
if(arr[j] < arr[j-1])
{
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
left++;
}
}
继续优化,有时候会有一种情况,就是部分有序的数组,我们可以加入一个flag,标记,如果数组已经有序,直接跳过
void Bubble2(int a[],int n)
{
int i,j,temp;
int left = 0;
int right = n-1;
int flag=0;
while(left < right)
{
flag = 0;
for(i = left;i<right;i++)
{
if(a[i] < a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
flag = 1;
}
}
right--;
if (flag == 0)//如果没有交换过元素,则已经有序,直接结束
{
return;
}
for(j = right;j>left;j--)
{
if(a[j] > a[j-1])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
flag = 1;
}
}
left++;
if (flag == 0)//如果没有交换过元素,则已经有序,直接结束
{
return;
}
}
}