【数据结构与算法】------冒泡排序

 学习开发一年的时间里,很少去了解排序算法,冒泡排序也是最开始学习的样子,靠死记硬背,没有引入自己的理解。

 对于什么时间复杂度和空间复杂度和稳定性也不清楚其原委,或许在代码方面少了几许的天分:

冒泡排序:

冒泡排序每一轮的比较都是前面的数和后面的数进行比较,并交换位置,每一轮结束,最大值就位于序列末尾。

下面代码是最初的冒泡排序代码:

public class bubbleSort {
      public static void sort(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]) {
    			    	int num = arr[j];
    			    	arr[j]=arr[j+1];
    			    	arr[j+1]=num;
    			    	
    			    }
    		   }
    	   }
      }
     public static void main(String[] args) {
		 int[]  arr = {20,40,30,10,60,50};
		 sort(arr);
		 for(int i=0;i<arr.length;i++) {
			 System.out.println(arr[i]);
		 }
	}
}

  因为冒泡排序,是前后两个数进行比较,即使一个序列后半部分是一个有序的序列,冒泡排序还是挨个进行比较这样就比较浪费时间。 通过添加一个标识符,如果有一轮比较,标识符没有改变,就结束循环。

代码如下:

public class bubbleSort {
    public static void main(String[] args) {
        int[] arr = {49,38,65,97,76,27,49};
        bubbleSort(arr);
        for(int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }
    }
       public static void bubbleSort(int[] arr){
        boolean flag;//
            for(int i = arr.length-1; i > 0; i--){
                flag = false; 
                for(int j = 0; j < i; j++){
                    if(arr[j] > arr[j+1]){
                        swap(arr,j,j+1);
                        flag = true;
                    }
                }
                if(!flag){
                    return;
                }
            }
       }
       public static void swap(int[] arr,int m,int n){
           int num = arr[m];
           arr[m] = arr[n];
           arr[n] = num;
       }
}

    冒泡排序是稳定的,因为当a = b时,只有大于才进行位置的交换,故 a 和 b 的位置没有计划进行交换,所以算法稳定。

猜你喜欢

转载自blog.csdn.net/taojin12/article/details/82894709