数据结构 -- 冒泡排序

1-1 :基本介绍

冒泡排序的基本思想:

        通过对, 待排序的序列从前往后依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前向后移动,就像水底下的气泡一样逐渐的往上冒。值

优化:

        因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下 来没有进行过交换,就说明序列有序,因此要在排序过程中设置 一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

图解:

        数据结构 -- 冒泡排序_第1张图片

小结:

        1.一共进行了数组大小 - 1 次打的循环

        2.每一趟排序的次数在减少

        3.如果我们在发现某趟排序中,没有发生一次交换,可以提前结束冒泡排序,这个就是优化

冒泡排序的应用实例:

public class BubbleSort {
public static void main(String[] args) {
 
    int[] arr = { 3, 9, -1, 10, 20 };
    bubbleSort(arr);
    public static void bubbleSort(int[] arr) {
		int temp = 0; // 临时变量
		boolean flag = false; // 标识变量,表示是否进行过交换
		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]) {
					flag = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			// System.out.println("第" + (i + 1) + "趟排序后的数组");
			// System.out.println(Arrays.toString(arr));

			if (!flag) { // 在一趟排序中,一次交换都没有发生过
				break;
			} else {
				flag = false; // 重置flag!!!, 进行下次判断
			}
		}
	}

        推导过程:


		  // 第二趟排序,就是将第二大的数排在倒数第二位
		  
		  for (int j = 0; j < arr.length - 1 - 1 ; j++) { 
                // 如果前面的数比后面的数大,则交换
                 if(arr[j]  > arr[j + 1]) { 
                    temp = arr[j]; arr[j] = arr[j + 1]; 
                    arr[j + 1] = temp; 
                } 
            }
		  
		  System.out.println("第二趟排序后的数组");             
          System.out.println(Arrays.toString(arr));
		 
		 
		  // 第三趟排序,就是将第三大的数排在倒数第三位
		  
		  for (int j = 0; j < arr.length - 1 - 2; j++) { 
                // 如果前面的数比后面的数大,则交换 
                if (arr[j] > arr[j + 1]) {
                     temp = arr[j];
                     arr[j] = arr[j + 1]; 
                     arr[j + 1] = temp; 
                } 
            }
		  
		  System.out.println("第三趟排序后的数组");         
          System.out.println(Arrays.toString(arr));
		  
		  // 第四趟排序,就是将第4大的数排在倒数第4位
		  
		  for (int j = 0; j < arr.length - 1 - 3; j++) { 
            // 如果前面的数比后面的数大,则交换 
                if (arr[j] > arr[j + 1]) { 
                    temp = arr[j]; 
                    arr[j] = arr[j + 1]; 
                    arr[j + 1] = temp; 
                } 
            }
		  
		  System.out.println("第四趟排序后的数组");     
          System.out.println(Arrays.toString(arr));
		 

时间复杂度:

冒泡排序正常的时间复杂度为O(N^2)。

空间复杂度

O(1)

算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

你可能感兴趣的:(排序算法,数据结构)