1. 程式人生 > >資料結構——交換排序(氣泡排序,快速排序)

資料結構——交換排序(氣泡排序,快速排序)

一.氣泡排序

1.原理:比較兩個相鄰的元素,將值大的元素交換至右端。

依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。

2.時間複雜度

1.如果我們的資料正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,氣泡排序最好的時間複雜度為O(n)。

  2.如果很不幸我們的資料是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:

氣泡排序的最壞時間複雜度為:O(n2) 。

綜上所述:氣泡排序總的平均時間複雜度為:O(n2) 。

3.程式碼實現:

複製程式碼
/*
 * 氣泡排序
 */
public class BubbleSort {
  public static void main(String[] args) {
    int[] arr={6,3,8,2,9,1};
    System.out.println("排序前陣列為:");
    for(int num:arr){
      System.out.print(num+" ");
    }
    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 temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    } 
    System.out.println();
    System.out.println("排序後的陣列為:");
     for(int num:arr){
       System.out.print(num+" ");
     } 
  }
 }

二.快速排序

1.原理

選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。

2.圖解

3.程式碼實現

public class quickSort {
 
  inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
 
public quickSort(){
 
    quick(a);
 
    for(int i=0;i<a.length;i++)
 
       System.out.println(a[i]);
 
}
 
public int getMiddle(int[] list, int low, int high) {   
 
            int tmp = list[low];    //陣列的第一個作為中軸   
 
            while (low < high) {   
 
                while (low < high && list[high] >= tmp) {   
 
                    high--;   
 
                }   
 
                list[low] = list[high];   //比中軸小的記錄移到低端   
 
                while (low < high && list[low] <= tmp) {   
 
                    low++;   
 
                }   
 
                list[high] = list[low];   //比中軸大的記錄移到高階   
 
            }   
 
           list[low] = tmp;              //中軸記錄到尾   
 
            return low;                   //返回中軸的位置   
 
        }  
 
public void _quickSort(int[] list, int low, int high) {   
 
            if (low < high) {   
 
               int middle = getMiddle(list, low, high);  //將list陣列進行一分為二   
 
                _quickSort(list, low, middle - 1);        //對低字表進行遞迴排序   
 
               _quickSort(list, middle + 1, high);       //對高字表進行遞迴排序   
 
            }   
 
        } 
 
public void quick(int[] a2) {   
 
            if (a2.length > 0) {    //檢視陣列是否為空   
 
                _quickSort(a2, 0, a2.length - 1);   
 
        }   
 
       } 
 
}