排序也稱排序算法(Sort Algorithm),排序是將一組數據,依指定的順序進行排列的過程。java
排序的分類:redis
1) 內部排序:指將須要處理的全部數據都加載到內部存儲器中進行排序。算法
2) 外部排序法:數據量過大,沒法所有加載到內存中,須要藉助外部存儲進行排序。數組
3) 常見的排序算法分類(見右圖):緩存
時間頻度:一個算法花費的時間與算法中語句的執行次數成正比例,哪一個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱爲語句頻度或時間頻度。記爲T(n)。函數
比如計算1-100全部數字之和, 咱們設計兩種算法:性能
T(n)=n+1;測試
T(n)=1;優化
|
T(n)=2n+20spa |
T(n)=2*n |
T(3n+10) |
T(3n) |
1 |
22 |
2 |
13 |
3 |
2 |
24 |
4 |
16 |
6 |
5 |
30 |
10 |
25 |
15 |
8 |
36 |
16 |
34 |
24 |
15 |
50 |
30 |
55 |
45 |
30 |
80 |
60 |
100 |
90 |
100 |
220 |
200 |
310 |
300 |
300 |
620 |
600 |
910 |
900 |
結論:
|
T(n)=2n^2+3n+10 |
T(2n^2) |
T(n^2+5n+20) |
T(n^2) |
1 |
15 |
2 |
26 |
1 |
2 |
24 |
8 |
34 |
4 |
5 |
75 |
50 |
70 |
25 |
8 |
162 |
128 |
124 |
64 |
15 |
505 |
450 |
320 |
225 |
30 |
1900 |
1800 |
1070 |
900 |
100 |
20310 |
20000 |
10520 |
10000 |
結論:
無論代碼執行了多少行,只要是沒有循環等複雜結構,那這個代碼的時間複雜度就都是O(1)
上述代碼在執行的時候,它消耗的時候並不隨着某個變量的增加而增加,那麼不管這類代碼有多長,即便有幾萬幾十萬行,均可以用O(1)來表示它的時間複雜度。
在while循環裏面,每次都將 i 乘以 2,乘完以後,i 距離 n 就愈來愈近了。假設循環x次以後,i 就大於 2 了,此時這個循環就退出了,也就是說 2 的 x 次方等於 n,那麼 x = log2n也就是說當循環 log2n 次之後,這個代碼就結束了。所以這個代碼的時間複雜度爲:O(log2n) 。 O(log2n) 的這個2 時間上是根據代碼變化的,i = i * 3 ,則是 O(log3n) .
說明:這段代碼,for循環裏面的代碼會執行n遍,所以它消耗的時間是隨着n的變化而變化的,所以這類代碼均可以用O(n)來表示它的時間複雜度
說明:線性對數階O(nlogN) 其實很是容易理解,將時間複雜度爲O(logn)的代碼循環N遍的話,那麼它的時間複雜度就是 n * O(logN),也就是了O(nlogN)
說明:平方階O(n²) 就更容易理解了,若是把 O(n) 的代碼再嵌套循環一遍,它的時間複雜度就是 O(n²),這段代碼其實就是嵌套了2層n循環,它的時間複雜度就是 O(n*n),即 O(n²) 如果將其中一層循環的n改爲m,那它的時間複雜度就變成了 O(m*n)
參考上面的O(n²) 去理解就行了,O(n³)至關於三層n循環,其它的相似
冒泡排序(Bubble Sorting)的基本思想是:經過對待排序序列從前向後(從下標較小的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就象水底下的氣泡同樣逐漸向上冒。
/** * @author Sun.Mr * @create 2019-09-20 22:19 */ public class Bubblesort { public static void main(String[] args) { int arr[] ={3,-2,9,10,7}; int temp = 0;//臨時變量 for (int i = 0; i <arr.length ; i++) { //若是前面的數比後面的數大,則交換 for (int j = 0; j <arr.length-1-i ; j++) { if (arr[j] > arr[j+1]) { temp=arr[j]; arr[j] =arr[j+1]; arr[j+1]=temp; } } System.out.println("第"+(i+1)+"趟排序後的數組"); System.out.println(Arrays.toString(arr)); } } }
優化:由於排序的過程當中,各元素不斷接近本身的位置,若是一趟比較下來沒有進行過交換,就說明序列有序,所以要在排序過程當中設置一個標誌flag判斷元素是否進行過交換。從而減小沒必要要的比較。
測試8000個數的冒泡排序的時間
選擇式排序也屬於內部排序法,是從欲排序的數據中,按指定的規則選出某一元素,再依規定交換位置後達到排序的目的。
選擇排序(select sorting)也是一種簡單的排序方法。它的基本思想是:第一次從arr[0]~arr[n-1]中選取最小值,與arr[0]交換,第二次從arr[1]~arr[n-1]中選取最小值,與arr[1]交換,第三次從arr[2]~arr[n-1]中選取最小值,與arr[2]交換,…,第i次從arr[i-1]~arr[n-1]中選取最小值,與arr[i-1]交換,…, 第n-1次從arr[n-2]~arr[n-1]中選取最小值,與arr[n-2]交換,總共經過n-1次,獲得一個按排序碼從小到大排列的有序序列。