冒泡排序优化
常规思路
-
对N个数进行冒泡排序的常规思路:
-
对相邻元素进行两两比较排序,将最大/小元素放在最后,每次确定一位
-
缩小比较区间,共需比较 (n-1)+(n-2)+(n-3)+…+1 = n^2/2次
private static void bubbleSort(int[] arr) { int n=arr.length; for(int i=0;i<n-1;i++) { for(int j=0;j<n-1-i;j++) { if(arr[j]>arr[j+1]) { swap(arr,j,j+1); } } } } private static void swap(int[] arr,int i,int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[j]^arr[i]; arr[i]=arr[i]^arr[j]; }
-
标记优化
-
标记优化是使用标记变量标记已经有序的情况,若判定有序立刻停止交换,这样可以减少无效的时间开销。
-
具体操作即用标志变量来表示有序。
private static void bubbleSort(int[] arr) { boolean isSwapped=true; int n=arr.length; for(int i=0;i<n-1;i++) { if(!isSwapped) { break; } for(int j=0;j<n-1-i;j++) { isSwapped=false; if(arr[j]>arr[j+1]) { swap(arr,j,j+1); isSwapped=true; } } } } private static void swap(int[] arr,int i,int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[j]^arr[i]; arr[i]=arr[i]^arr[j]; }
算法特性
- 时间复杂度:O(N^2)
- 空间复杂度:O(1) 原地交换
- 稳定性: 元素值相同时不交换,因此不会改变相同元素的相对位置,稳定。