文章目录
1, 冒泡算法
a06_01_Bubble_basic
package im.bool.a06_sort_algrithm;
/**
* #Author : ivanl001
* #Date : 2020/2/24 9:53 AM
* #Desc : 排序算法之冒泡推算过程:
* 这个过程中有一个优化过程:如果经过一轮冒泡,顺序完全没有变动,那么后续就不需要进行了,因为这个时候顺序已经排好了
**/
public class a06_01_Bubble_basic {
public static void main(String[] args) {
int[] nums = {3, 9, -1, -2, 10};
int temp;
System.out.println("第一次冒泡:");
for (int i=0;i<nums.length-1;i++) {
if (nums[i] > nums[i+1]) {
temp = nums[i];
nums[i] = nums[i + 1];
nums[i+1] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + ", ");
}
System.out.println();
System.out.println("第二次冒泡:");
for (int i=0;i<nums.length-1-1;i++) {
if (nums[i] > nums[i+1]) {
temp = nums[i];
nums[i] = nums[i + 1];
nums[i+1] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + ", ");
}
System.out.println();
System.out.println("第三次冒泡:");
for (int i=0;i<nums.length-1-2;i++) {
if (nums[i] > nums[i+1]) {
temp = nums[i];
nums[i] = nums[i + 1];
nums[i+1] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + ", ");
}
System.out.println();
System.out.println("第四次冒泡");
for (int i=0;i<nums.length-1-3;i++) {
if (nums[i] > nums[i+1]) {
temp = nums[i];
nums[i] = nums[i + 1];
nums[i+1] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + ", ");
}
System.out.println();
}
}
a06_02_Bubble
package im.bool.a06_sort_algrithm;
import jdk.internal.org.objectweb.asm.tree.FrameNode;
import java.util.Arrays;
/**
* #Author : ivanl001
* #Date : 2020/2/24 5:58 PM
* #Desc : 冒泡排序算法:两次循环实现
**/
public class a06_02_Bubble {
public static void main(String[] args) {
/*int[] nums = {9, -2, -1, 3, 10, 100, -3, 3, 4, 20};
bubbleSort(nums);
for (int j = 0; j < nums.length; j++) {
System.out.print(nums[j] + ", ");
}
System.out.println();*/
int[] nums = new int[80000];
for (int i = 0; i < 80000; i++) {
nums[i] = (int) (Math.random() * 80000);
}
// System.out.println(Arrays.toString(nums));
long startTime = System.currentTimeMillis();
bubbleSort(nums);
long endTime = System.currentTimeMillis();
//9s左右
System.out.println(endTime-startTime);
}
public static void bubbleSort(int[] nums) {
int temp;
boolean isOrdered = false;
//因为冒泡排序算法是两层循环,所以冒泡排序算法的时间复杂度是O(n^2)
for (int i = 0; i < nums.length-1; i++) {
isOrdered = true;
// System.out.println("第" + (i+1) + "次冒泡:");
//-------------------冒泡算法的精华代码--------------------
for (int j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
isOrdered = false;
}
}
/*for (int j = 0; j < nums.length; j++) {
System.out.print(nums[j] + ", ");
}
System.out.println();*/
//这个地方是一个小优化。如果经过一轮,数据顺序完全没有变动
if (isOrdered) {
System.out.println("第" + (i+1) + "次循环");
System.out.println("已经有序。。。");
break;
}
}
}
}
a06_03
- 如果是向左冒泡,那么左边的边界需要依次变大
- 如果是向右冒泡, 那么右边的边界需要依次变小
// 如果是向左冒泡,那么左边的边界需要依次变大
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = arr.length-1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
// 如果是向右冒泡, 那么右边的边界需要依次变小
public static void bubbleSort_v1(int[] arr){
for (int i = 0; i < arr.length; i++) {
// 注意:这里j < arr.length-i-1, 是减去i哈
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}
}