您的位置:首页 > 编程语言 > Java开发

冒泡排序之java数组实现

2017-09-20 17:45 225 查看
冒泡排序的算法思想:比较相邻两个元素的关键字值,如果反序,则交换。若按照升序排序,每一趟将扫描数据序列的最大值到最后位置。

即最多扫描n-1次,每次确定一个值。下面是一个数组的冒泡排序实现:

/*
* 冒泡排序是稳定的
* 从小到大冒泡排序
* 冒泡排序时间效率在O(n)和O(n*n)之间
*/
public static int[] bubbleSortAsc(int data[])
{
boolean exchange=true; //默认初始有交换
for(int i=1;i<data.length&&exchange;i++) // 最多循环data.length-1次 exchange=false停止
{
exchange=false; //进入循环后exchange=false
for(int j=0;j<data.length-i;j++)
{
//大就交换位置
if(data[j]>data[j+1])
{
int temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
exchange=true; //如果有交换exchange=true 那么意味着可能会继续循环
}
}
}
return data;
}
交换位置的方法可以提取为一个方法:
/*
* 定义数组元素交换
* 数组data的x下标和y下标的交换
*/
private static int[] swap(int data[],int x,int y)
{
int temp=data[x];
data[x]=data[y];
data[y]=temp;
return data;
}
冒泡排序的exchange标记可以避免不必要的比较,如果没有这个标记,就像下面这样:
/*
* 冒泡排序 没有交换标记
* 从后往前冒泡
*/
public static int[] buuleSort(int[] data)
{
//从后往前 n-1次扫描
for(int i=data.length-1;i>0;i--)
{
//比较
for(int j=data.length-1;j>=data.length-i;j--)
{
if(data[j]<data[j-1])
swap(data, j, j-1);
}
}
return data;
}
这样的话虽然也可以实现排序,但是它的比较次数是固定的,与需要排序的序列的顺序无关,因此正确的是最上面那样的写法。
冒泡排序是稳定的排序算法,要排序的序列有序时,适宜采用冒泡排序。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  冒泡排序 java 数组