冒泡排序 小白学demo_day2

冒泡排序的过程:

重复地走访要排序的元素,依次比计较两个相邻的元素,如果他们的顺序错误就把他们交换过来。走访元素的工作室重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

简单说,就是比较相邻的两个元素,将值大的元素交换到右边

是否稳定

如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式,因此,冒泡排序是一种稳定排序算法

算法

N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数

时间复杂度

1,如果我们的数据正序,只需要走一趟即可完成排序,所需的比较次数C和记录移动次数M均达到最小值,即:C min=n-1; M min = 0;所以,最好的时间复杂度为O(n)

2,如果很不幸,我们的数据是反序的,则需要进行n-1趟排序,每趟排序要进行n-i次比较(1<=i<=n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

在这里插入图片描述
所以,最终的时间复杂度为:O(n^2)

冒泡排序的示例

[2  4  3  1  6  5]         初始状态序列   
[2  3  1  4  5][6]         第一次冒泡结束
[2  1  3  4][5  6]         第二次冒泡结束
[1  2  3][4  5  6]         第三次冒泡结束
[1  2][3  4  5  6]         第四次冒泡结束
[1  2  3  4  5  6]         第五次冒泡结束

冒泡排序常规代码

void bubble_sort(int[] arr,int len) {//一定要记住判断边界条件if(arr == null || len < 2) {return;}for(int i = 0;i < len-1; i++) {//第i趟比较for(int j = 0; j < len -1 -i; i++){//开始进行比较,如果前面值比后面值大,那就交换位置if (arr[j] > arr[j+1]) {int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;}}}System.out.println("最终得到的数组是:")for (int k = 0; k< arr.length;k++) {System.out.println(arr[k]+"");}
}

如果,设置一个标志位,不再进行数据交换,说明已经排序完成,则无需再进行交换

冒泡排序的简单优化代码:

void bubble_sort(int[] arr) {if(arr == null || arr.length < 2) {return;}int flag = 0;for(int i = 0; i < arr.length; i++) {for( int j = 0; j < arr.length -1 -i; j++) {if(arr[j] > arr[j+1]) {int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;flag = 0; //发生交换,标志位置为0}}}System.out.println("第%d遍最终结果:",i+1);for(int count : list) {System.out.println(count);}System.out.println("");if (flag == 1) {return;}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部