一、 排序算法 之 冒泡排序
冒泡排序
重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。
例子:
複雜度:
時間複雜度
時間複雜度 爲
O(n^2)
最佳時間複雜度是O(n)
空間複雜度
最差爲
O(n)
空間複雜度爲O(1)
穩定排序
####代碼實現(JAVA)
package com.ldj.sort;
/**
* 冒泡排序
* 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
* 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
* 針對所有的元素重複以上的步驟,除了最後一個。
* 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
* */
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[]{32,34,55,12,32,10};
bubbleSort(arr);
for (int i : arr) {
System.out.println(i);
}
}
private static void bubbleSort(int[] arr) {
for (int i = 0 ; i < arr.length ; i++) {
for (int j = 0 ; j < arr.length - 1 - i; j++ ) {
// j = 0, 1, 2, 3... arr.length -1
// ..
// j = 0
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 優化
private static void bubbleSort2(int[] arr) {
for (int i = 0 ; i < arr.length ; i++) {
boolean change = false;
for (int j = 0 ; j < arr.length - 1 - i; j++ ) {
if (arr[j] > arr[j + 1]) {
change = true;
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// 假如沒有更換則說明已經排序
if (!change) {
break;
}
}
}
}
二、 排序算法 之 快速排序
快速排序:
快速排序是對冒泡排序的一種優化,通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
例子:
複雜度:
時間複雜度
:
快速排序最優的情況下時間複雜度爲:O( nlogn )
最差情況下時間複雜度爲:O(n^2)
平均時間複雜度爲 O(nlogn)
空間複雜度
:
最優的情況下空間複雜度爲:O(logn) ;每一次都平分數組的情況
最差的情況下空間複雜度爲:O( n ) ;退化爲冒泡排序的情況
不穩定的排序
代碼實現(JAVA)
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{32,34,55,12,32,10};
quickSort(arr);
for (int i : arr) {
System.out.println(i);
}
}
public static void quickSort(int[] numbers) {
quickSort(numbers, 0, numbers.length - 1);
}
/**
* 遞歸排序, 分治法遞歸排序
* */
private static void quickSort(int[] numbers, int low, int high) {
if (low < high) {
int middle = middleSort(numbers, low, high);
quickSort(numbers, low, middle - 1);
quickSort(numbers, middle + 1, high);
}
}
/**
* 根據第一個獲取中軸進行分治, 分成兩部分, 左邊都是小的, 右邊都是大的。
* */
private static int middleSort(int[] numbers, int low, int high) {
int temp = numbers[low];
while (low < high) {
while (low < high && temp <= numbers[high]) {
high--;
}
numbers[low] = numbers[high];
while( low < high && temp >= numbers[low]) {
low ++;
}
numbers[high] = numbers[low];
}
numbers[low] = temp;
return low;
}
}