冒泡排序之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;
}
这样的话虽然也可以实现排序,但是它的比较次数是固定的,与需要排序的序列的顺序无关,因此正确的是最上面那样的写法。
冒泡排序是稳定的排序算法,要排序的序列有序时,适宜采用冒泡排序。
即最多扫描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实现
- Java数组实现冒泡排序
- java实现数组的冒泡排序、选择排序代码
- java数组冒泡排序 面试即然忘记这种写法,只说了用二重循环实现,哎!重温下基础吧
- Java 数组实现冒泡排序
- java类实现数组的五种排序 冒泡排序、选择排序、插入排序、希尔排序、数组排序
- 【Java】数组的冒泡排序和选择排序(原理+代码实现)
- Java实现数组排序含冒泡排序、选择排序
- java实现的冒泡排序
- java实现 冒泡排序 插入排序 选择排序
- 冒泡排序、选择排序、插入排序、快速排序算法的时间性能分析(java实现)
- java实现冒泡排序
- Java实现冒泡排序
- 用java数组实现基本链表和可自扩充的链表
- Java数组实现循环队列
- 数据结构复习:队列-Java数组实现
- 数据结构复习:栈-Java数组实现
- java实现合并两个数组
- JAVA实现:给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里
- Java实现冒泡排序