(2)交换排序之冒泡排序
- 2019 年 10 月 4 日
- 筆記
title: (2)交换排序之冒泡排序 date: 2019-02-10 13:00:00 +0800 update: 2019-02-10 13:00:00 +0800 author: me cover: http://ww1.sinaimg.cn/large/006jIRTegy1fzwiafdswej31jk0v9qp2.jpg preview: 冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 tags:
- 算法
文章目录

(2)交换排序之冒泡排序
算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
演示图

时间复杂度
平均: O(n^2)
最好: O(n)
最差: O(n^2)
空间复杂度
O(1)
稳定性
稳定
Java代码实现
(1) 没有任何优化
class BubbleSortClass{ public static void main(String[] args) { System.out.println("冒泡排序-没有优化的"); int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22}; System.out.println("原数组"); for(int i:arr){ System.out.print(i+","); } BubbleSortClass.BubbleSort(arr); System.out.printf("n排序后的n"); for(int i:arr){ System.out.print(i+","); } } public static void BubbleSort(int[] arr){ int i ,j; int n=arr.length; for(i=0;i<n-1;i++){ for(j=1;j<n-i;j++){ if(arr[j-1]>arr[j]){ int temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } } } } }
(2) 对本身有排序的进行优化
如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
class BubbleSortClass{ public static void main(String[] args) { System.out.println("冒泡排序-没有优化的"); int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22}; System.out.println("原数组"); for(int i:arr){ System.out.print(i+","); } BubbleSortClass.BubbleSort(arr); System.out.printf("n排序后的n"); for(int i:arr){ System.out.print(i+","); } } public static void BubbleSort(int[] arr){ int i ,j; int n=arr.length; //设置标志 boolean flag = true; while(flag){ //进来先设置为false flag = false; for(j=1;j<n;j++){ if(arr[j-1]>arr[j]){ int temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; //如果数据进行交换,证明仍需要进行排序 flag=true; } } //一次排序后,已经确定一位 n--; } } }
(3) 部分有序,部分无序
现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字
class BubbleSortClass{ public static void main(String[] args) { System.out.println("冒泡排序-没有优化的"); int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22}; System.out.println("原数组"); for(int i:arr){ System.out.print(i+","); } BubbleSortClass.BubbleSort(arr); System.out.printf("n排序后的n"); for(int i:arr){ System.out.print(i+","); } } public static void BubbleSort(int[] arr){ int i ,j; int n=arr.length; //需要排序的边界,刚开始为n int border = n; //border=0 可以不用排序 while(border>0){ //边界后的已经是有序的 n=border; border = 0; for(j=1;j<n;j++){ if(arr[j-1]>arr[j]){ int temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; //如果数据进行交换,证明仍需要进行排序,将边界设置为j border=j; } } } } }