有序度:數組中具備有序關係的元素對的個數數組
有序元素對:a[i] <= a[j],若是i < j。 徹底有序的數組,有序度就是 n * (n - 1) /2(滿有序度) 逆序度 = 滿有序度 - 有序度
- 冒泡排序
-
特性url
- 原地
- 穩定
- O(n**2)(最少0次交換,最多n*(n-1)/2次交換)
-
冒泡排序每次比較相鄰兩數,若爲逆序則交換,因此冒泡排序交換次數老是肯定的,即爲逆序度。.net
-
-
插入排序code
-
特性排序
- 原地
- 穩定
- O(n**2)(將一個數據插入數組(O(n)),重複n次)
-
插入排序將數組分爲兩個區間:已排序區間和未排序區間。初始已排序區間只有一個元素,就是數組首元素。每次取未排序區間元素在已排序區間中找到合適的位置插入,直到未排序區間爲空。插入排序移動操做的次數是固定的,等於逆序度。get
-
-
兩種排序算法比較io
-
雖然兩種排序算法相同,都是原地、穩定排序,但插入排序要比冒泡排序更優思維導圖
-
冒泡排序交換次數和插入排序數據移動次數同樣,都等於逆序度class
-
冒泡排序數據交換須要3個賦值操做,而插入排序數據移動只須要1個。
-
冒泡排序和插入排序Java實現
public class Sort { /** * 冒泡排序 * * @param arr * @param n */ public static void bubbleSort(int arr[], int n) { if (n <= 1) return; int count = 0; //最多進行n - 1次冒泡 for (int i = 0; i < n; i++) { boolean swaped = false; for (int j = 0; j < n - i - 1; j++) { //每次比較相鄰數 把較大的放在後面 if (arr[j] > arr[j + 1]) { int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; swaped = true; } } count++; if (!swaped) break; } System.out.println("進行了" + count + "次冒泡"); } /** * 插入排序 * * @param arr * @param n */ public static void inserctionSort(int arr[], int n) { if (n <= 1) return; //將數組分爲已排序部分和未排序部分 for(int i = 1; i < n; i++) { int value = arr[i];//未排序部分的第一個值 int j = i - 1; //每次將未排序部分的第一個值插入已排序部分中 for(; j >= 0; j--){ //尋找插入點 arr[j]爲第一個小於等於value的值 if(arr[j] > value) arr[j + 1] = arr[j]; else break; } //將value插入到j後面 arr[j + 1] = value; } } public static void sortTest() { int arr[] = {3, 5, 4, 1, 2, 6}; printArr(arr); inserctionSort(arr, arr.length); printArr(arr); } public static void printArr(int arr[]) { for (int i : arr) { System.out.print(i + " "); } System.out.println(); } }