首页 > 编程知识 正文

java冒泡排序原理(给出冒泡排序算法思路)

时间:2023-05-05 13:51:43 阅读:68475 作者:2045

使用Ava进行气泡排序1,实现气泡排序:使用气泡排序对数组进行排序

二、基本概念:依次比较相邻的两个个数,小数在前,大数在后。 即,第1次:首先比较第1个和第2个个数,以小数为前,以大数为后。 然后,比较第二个数和第三个数,以小数为前,以大数为后,比较最后两个数,持续到小数为前,以大数为后。 第一集到此结束,最大的数量是最后一次了。 (第二次(还是从第一对数开始比较)因为第二个数和第三个数的交换可能不再使第一个数小于第二个数) (把小数放在前面,把大数放在后面,比较到倒数第二个数) )第二次结束,倒数第二以这种方式重复上述过程,直到最终排序完成。

三、实现思路:采用双环实现,外环变量为I,内环变量为j。 有n个需要排序时,外循环依次重复n-1次,内循环依次重复n-1、n-2、…、1次。 每次比较的两个元素与内循环j相关,可以分别用a[j]和a[j 1]识别,I的值依次为1、2、…、n-1,对于各个I,j的值依次为0、1、2、…n-i。

设数组长度为n :

1 .比较相邻的前后两个数据,如果前面的数据大于后面的数据,则交换两个数据。

2 .这样从数组的第0个数据到第N-1个数据扫描一次,最大的一个数据“下沉”到数组的第N-1个位置。

3.N=N-1,如果n不为0,则重复前面两步。 否则排序就完成了。

package泡沫排序; import java.util.Arrays; /** *气泡排序* @ author zy * * /公共类bubble sort { publicstaticvoidbubblesort (int [ ] arr ) { int temp; //定义临时变量for (inti=0; iarr.length-1; I () /鼓泡圈数for(intj=0; jarr.length-i-1; j () if ) arr[j1]arr[j] ) { temp=arr[j]; arr[j]=arr[j 1]; arr[j 1]=temp; } } publicstaticvoidmain (字符串(args ) intarr )=newint ) ) 1、6、2、2、5 ); bubblesort.bubblesort(arr ); 系统. out.println (arrays.tostring (arr ) ); (五、配置文件)如果记录序列的初始状态为“正序”,则冒泡排序过程只需要一次排序,排序过程只需要n-1次比较,不移动记录; 相反,如果记录序列的初始状态为“逆序”,则需要n(n-1 )/2次比较和记录移动。 因此,通过鼓泡进行排序的总时间复杂度是o(n*n )。

六、算法优化:泡沫排序方法的不足和改进方法:

首先,在排序过程中,执行最后一次排序后,所有数据都已排序,但程序无法确定排序是否完成。 为了解决这一不足,可以设置标志位flag,将其初始值设置为0以外,以表示排序表是无序表,在排序开始前将flag值设置为0,在数据交换时将flag值更改为0以外。 在新排序开始时检查此标志。 此标志为0表示上次没有交换过数据,并结束排序。 否则排序;

package泡沫排序; import java.util.Arrays; /** *气泡排序的改进版* @ author zy * * /公共类bubble sort1{ publicstaticvoidbubblesort (int [ ] arr ) { boolean flag=true wile (标志) { int temp; //定义临时变量for (inti=0; iarr.length-1; I () /鼓泡圈数、n-1圈for(intj=0; jarr.length-i-1; j () if ) arr[j1]arr[j] ) { temp=arr[j]; arr[j]=arr[j 1]; arr[j 1]=temp; 标志=true; }if (! flag () { break; //如果没有交换,就退出循环}

} } public static void main(String[] args) { int arr[] = new int[]{1,6,2,2,5}; BubbleSort.BubbleSort(arr); System.out.println(Arrays.toString(arr)); }}

第二、在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年来的一些改进的算法中,只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。局部冒泡排序与冒泡排序算法具有相同的时间复杂度,并且在正序和逆序的情况下,所需的关键字的比较次数和移动次数完全相同。由于局部冒泡排序和冒泡排序的数据移动次数总是相同的,而局部冒泡排序所需关键字的比较次数常少于冒泡排序,这意味着局部冒泡排序很可能在平均比较次数上对冒泡排序有所改进,当比较次数较少的优点不足以抵消其程序复杂度所带来的额外开销,而当数据量较大时,局部冒泡排序的时间性能则明显优于冒泡排序。对于N个无序数据,我们在进行一趟冒泡排序时,如果第k个数据和第k+1个数据逆序,那么对第k+1个数据进行一趟向前的冒泡排序,使其移动到合适的位置,也就是说让前面k+1个数据调节为正序。因为这种冒泡法只对前k+1个数据冒泡处理,所以我们称它为——局部冒泡

Java 实现双向冒泡排序

冒泡排序_鸡尾酒排序

就是双向冒泡排序

此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序,外层比较左右边界l<r,

内层一个循环从左向右比,取高值置后;一个循环从右向左,取低值置前;

效率上,O(N^2), 不比普通的冒泡快

public class Bubble_CocktailSort {public static void main(String[] args) {int len = 10;int[] ary = new int[len];Random random = new Random();for (int j = 0; j < len; j++) {ary[j] = random.nextInt(1000);}/* * 交换次数最小也是1次,最大也是(n^2-n)/2次 *///ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //测试交换次数//ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //测试交换次数System.out.println("-------排序前------");for (int j = 0; j < ary.length; j++) {System.out.print(ary[j] + " ");}orderAsc1(ary);//orderAsc2(ary);//降序,只需要把判断大小于 置换一下}static void orderAsc1(int[] ary) {int compareCount = 0;//比较次数int changeCount = 0;//交换次数int len = ary.length;int left = 0, right = len -1, tl, tr;while (left < right) {//外层固定循环次数tl = left + 1;tr = right - 1;for (int k = left; k < right; k++) {//内层从多到少递减比较次数, 从左向右if (ary[k] > ary[k + 1]) {//前大于后, 置换ary[k] = ary[k + 1] + (ary[k + 1] = ary[k]) * 0;//一步交换changeCount++;tr = k; //一轮中最后一比较的时候,将k所在索引赋给tr, tr表示以后比较的结束索引值, 从左向右比后,k表示左边的索引} compareCount++;}right = tr;for (int k = right; k > left; k--) {//内层从多到少递减比较次数, 从右向左if (ary[k] < ary[k - 1]) {//后小于前 置换ary[k] = ary[k - 1] + (ary[k - 1] = ary[k]) * 0;//一步交换changeCount++;tl = k; //一轮中最后一比较的时候,将k所在索引赋给tl, tl表示以后比较的开始索引值, 从向右向左比后,k表示右边的索引} compareCount++;}left = tl;}System.out.println("n-----orderAsc1升序排序后------比较次数:" + compareCount + ", 交换次数:" + changeCount);for (int j = 0; j < len; j++) {System.out.print(ary[j] + " ");}}//跟orderAsc1的思路没有区别static void orderAsc2(int[] ary) {int compareCount = 0;//比较次数int changeCount = 0;//交换次数int len = ary.length;int l = 0, r = len -1, tl, tr;for (; l < r; ) {//外层固定循环次数tl = l + 1;tr = r - 1;/* * 从左向右比,将大的移到后面 */for (int k = l; k < r; k++) {if (ary[k] > ary[k + 1]) {int temp = ary[k] + ary[k + 1];ary[k + 1] = temp - ary[k + 1];ary[k] = temp - ary[k + 1];changeCount++;tr = k;}compareCount++;}r = tr;/* * 从右向左比,将小的移到前面 */for (int k = r; k > l; k--) {if (ary[k] < ary[k - 1]) {int temp = ary[k] + ary[k - 1];ary[k - 1] = temp - ary[k - 1];ary[k] = temp - ary[k - 1];changeCount++;tl = k;}compareCount++;}l = tl;}System.out.println("n-----orderAsc2升序排序后------比较次数:" + compareCount + ", 交换次数:" + changeCount);for (int j = 0; j < len; j++) {System.out.print(ary[j] + " ");}}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。