冒泡核心思想:
冒泡排序向右边冒泡的话,结果就是最后一个数就是最大的
冒泡排序向左边冒泡的话,结果就是第一个数就是最小的
这个好像不是冒泡吧。。。
private static void maoPaoSort(int [] arr){ for(int i=0;i<arr.length;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ swap(arr,i,j); } } } }
常规冒泡
private static void maoPaoSort1(int [] arr){ for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ swap(arr,j,j+1); } } } }
flag标志是否已经有序
private static void maoPaoSort2(int [] arr){ for(int i=0;i<arr.length-1;i++){ boolean flag = false; for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ swap(arr,j,j+1); flag = true; } } //说明已经有序 if(!flag){ return; } } }
双向冒泡
private static void maoPaoSort3(int [] arr){ int left = 0,right = arr.length-1; while(left<right){ for(int i=left;i<right;i++){ if(arr[i]>arr[i+1]){ swap(arr,i,i+1); } } right--; for(int j=right;j>left;j--){ if(arr[j]<arr[j-1]){ swap(arr,j,j-1); } } left++; } }
双向冒泡+记录swapPos
private static void maoPaoSort4(int [] arr){ int left = 0,right = arr.length-1; int swapPos = left; while(left<right){ for(int i=left;i<right;i++){ if(arr[i]>arr[i+1]){ swap(arr,i,i+1); swapPos = i; } } right = swapPos; for(int j=right;j>left;j--){ if(arr[j]<arr[j-1]){ swap(arr,j,j-1); swapPos = j; } } left = swapPos; } }