冒泡排序之java数组实现

来源:互联网 发布:csdn黑马程序员 编辑:程序博客网 时间:2024/06/08 00:05

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

即最多扫描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=falsefor(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;}
这样的话虽然也可以实现排序,但是它的比较次数是固定的,与需要排序的序列的顺序无关,因此正确的是最上面那样的写法。

冒泡排序是稳定的排序算法,要排序的序列有序时,适宜采用冒泡排序。


原创粉丝点击