氣泡排序+快速排序
一.氣泡排序:
外層迴圈控制排序躺數:n個數需要跑n-1躺,一個數組的長度為length,那麼下標為length-1,那麼最大趟數為length-2,即寫為<length-1 //因為比較剩下最後一個數時,無需比較。
內層迴圈控制每一趟的比較次數:每一趟需要比較n-i次
/* * 氣泡排序 */ 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+" "); } } }
二.快速排序:
快速排序,顧名思義,是一種速度快,效率高的排序演算法。
快排原理:
在要排的數(比如陣列A)中選擇一箇中心值key(比如A[0]),通過一趟排序將陣列A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重複這個過程,直到整個有序。
整個快排的過程就簡化為了一趟排序的過程,然後遞迴呼叫就行了。
一趟排序的方法:
1,定義i=0,j=A.lenght-1,i為第一個數的下標,j為最後一個數下標
2,從陣列的最後一個數Aj從右往左找,找到第一小於key的數,記為Aj;
3,從陣列的第一個數Ai 從左往右找,找到第一個大於key的數,記為Ai;
4,交換Ai 和Aj
5,重複這個過程,直到 i=j
6,調整key的位置,把A[i] 和key交換
假設要排的陣列為:A[8] ={ 5 2 8 9 2 3 4 9 }
選擇 key = 5, 開始時 i=0,j=7
開始: 5 2 8 9 2 3 4 9
i j
第一次找 5 2 8 9 2 3 4 9
i j
交換: 5 2 4 9 2 3 8 9
i j
第二次找 5 2 4 9 2 3 8 9
i j
交換: 5 2 4 3 2 9 8 9
i j
第三次找 5 2 4 3 2 9 8 9
ij
調整key: 2 2 4 3 5 9 8 9
ij
以下為程式碼:
public class QuickSort { public static void main(String[] args) { int[] a = {1, 2, 4, 5, 7, 4, 5 ,3 ,9 ,0}; System.out.println(Arrays.toString(a)); quickSort(a); System.out.println(Arrays.toString(a)); } public static void quickSort(int[] a) { if(a.length>0) { quickSort(a, 0 , a.length-1); } } private static void quickSort(int[] a, int low, int high) { //1,找到遞迴演算法的出口 if( low > high) { return; } //2, 存 int i = low; int j = high; //3,key int key = a[ low ]; //4,完成一趟排序 while( i< j) { //4.1 ,從右往左找到第一個小於key的數 while(i<j && a[j] > key){ j--; } // 4.2 從左往右找到第一個大於key的數 while( i<j && a[i] <= key) { i++; } //4.3 交換 if(i<j) { int p = a[i]; a[i] = a[j]; a[j] = p; } } // 4.4,調交換key和零界點的值 int p = a[i]; a[i] = a[low]; a[low] = p; //5, 對key左邊的數快排 quickSort(a, low, i-1 ); //6, 對key右邊的數快排 quickSort(a, i+1, high); } }
快速排序的複雜度:
最糟糕的情況下, 複雜度為: O(n2)
最優的情況下, 複雜度為: O(nlog2n)
最差情況下, 快速排序和氣泡排序的時間複雜度是O(n2), 但是最優情況下, 氣泡排序是 n * n, 而快速排序的是 n * log2n,
如果n=16,
則冒泡是 16 * 16
快速排序是 16 * 4
可見, 只要你不是背到家, 都是比冒泡來的快的.
原文:https://blog.csdn.net/Yexiaofen/article/details/78018204?utm_source=copy