现有数组a[n]
思想: 将较小的数(或较大的数)前移;主要有两种求解方法,冒泡是从前半段还是从后半段开始
(1)基本
冒泡数组首部开始:
void BubbleSort(type a[],int n)
{
int i,j;
type temp;
for(i=0;i<n;i++)
{
for(j=1;j<n-i;j++)
{
if(a[j-1]>a[j])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}
冒泡从数组尾部开始:
//冒泡从后半段开始 基本冒泡排序
void BubbleSort_1(type a[],int n)
{
int i,j;
type temp;
for(i=0;i<n;i++)
{
for(j=n-1;j>i;j--)
{
if(a[j-1]>a[j])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}
(2)改进
设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
//冒泡排序改进方法1 冒泡从数组首部开始
void BubbleSort1(type a[], int n)
{
int i,j;
type temp;
bool flag; //交换标志位
for(i=0;i<n;i++)
{
flag=false;
for(j=1;j<n-i;j++)
{
if(a[j-1]>a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
flag=true;
}
}
if(!flag) //如果没有发生交换 说明已完成排序
return;
}
}
//冒泡排序改进方法1 冒泡从数组尾部开始
void BubbleSort1_1(type a[], int n)
{
int i,j;
type temp;
bool flag; //交换标志位
for(i=0;i<n;i++)
{
flag=false;
for(j=n-1;j>i;j--)
{
if(a[j-1]>a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
flag=true;
}
}
if(!flag) //如果没有发生交换 说明已完成排序
return;
}
}
(3)改进2
记录一次冒泡后最后交换的位置
代码如下:
//冒泡排序改进2 记录最后发生交换的记录 冒泡从数组首部开始
void BubbleSort2(int a[], int n)
{
int i,j;
type temp;
int flag; //最后一次交换的位置
flag=0;
for(i=0;i<n;i++)
{
for(j=1;j<n-flag;j++)
{
if(a[j-1]<a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
flag=j-1;
}
}
//冒泡排序改进2 记录最后发生交换的记录 冒泡从数组尾部开始
void BubbleSort2_1(int a[], int n)
{
int i,j;
type temp;
int flag; //最后一次交换的位置
flag=0;
for(i=0;i<n;i++)
{
for(j=n-1;j>flag;j--)
{
if(a[j-1]>a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
flag=j+1;
}
}
参考来源: MoreWindows 博客 http://blog.csdn.net/morewindows/article/details/6657829