對於排序演算法執行效率的分析,我們一般會從這幾個方面來衡量:
1.最好情況、最壞情況、平均情況時間複雜度
我們在分析排序演算法的時間複雜度時,要分別給出最好情況、最壞情況、平均情況下的時間複雜度。
2.時間複雜度的係數、常數 、低階
我們知道,時間複雜度反應的是資料規模n很大的時候的乙個增長趨勢,所以它表示的時候會忽略係數、常數、低階。但是實際的軟體開發中,我們排序的可能
是10個、100個、1000個這樣規模很小的資料,所以,在對同一階時間複雜度的排序演算法效能對比的時候,我們就要把係數、常數、低階也考慮進來。
3.比較次數和交換(或移動)次數
基於比較的排序演算法的執行過程,會涉及兩種操作,一種是元素比較大小,另一種是元素交換或移動。所以,如果我們在分析排序演算法的執行效率的時候,應該把比較次數和交換(或移動)次數也考慮進去。
排序演算法的記憶體消耗
演算法的記憶體消耗可以通過空間複雜度來衡量,排序演算法也不例外。不過,針對排序演算法的空間複雜度,我們還引入了乙個新的概念,原地排序(sorted in place)。原地排序演算法,就是特指空間複雜度是o(1)的排序演算法。
排序演算法的穩定性
僅僅用執行效率和記憶體消耗來衡量排序演算法的好壞是不夠的。針對排序演算法,我們還有乙個重要的度量指標,穩定性。這個概念是說,如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。
排序演算法是否穩定有什麼用處:
穩定的排序演算法代表著在排序之後相等的元素前後位置不會調換
場景:訂單按照**排序,如果**相同則按照,時間先後排序
一般的先按照**排序,再按照時間來排,之前的順序就會被打亂,所以先按照時間來排序,然後用乙個原地排序的演算法就可以滿足這個場景。
1.氣泡排序
比較,交換。一次迴圈保證有乙個數到了正確的位置。
全部迴圈完後,所有數有序。當然也有可能在一開始或者是到中途的時候,陣列就已經是有序的了,可以加乙個終止條件如果不進行比較,就可以結束迴圈。**如下
/**
*氣泡排序
* @param array
* @return
*/public static int bubblesort(int array)
}if (end == true)
}return array;
}
分析得出氣泡排序的最壞情況,陣列完全完全逆序,時間複雜度是o(n2),最好情況陣列原本就是有序的,時間複雜度是o(n),平均時間複雜度是o(n2)。
氣泡排序不用額外的儲存空間,因此是原地排序。
氣泡排序可以讓兩數相等的情況下前後不進行交換,所以是穩定的排序演算法。
2.插入排序
從第二個數開始迴圈,與前面的數相比較,比選中的數大,往後移動一位,知道找到不大於選中的那個數為止,插入,前面的是有序的區間後邊的是無序的區間。
**如下:
/**
*插入排序
* @param array
* @return
*/public static intinsertsort(int array)else
}array[j+1]=value;
}return array;
}
最壞情況時間複雜度跟每乙個資料都要比較,都要資料搬移時間複雜度是o(n2),最好情況是只要遍歷比較一遍不需要資料的搬移時間複雜度是o(n),
平均時間複雜度每插入一次的時間複雜度是o(n),外邊要迴圈n次,因此平均是o(n2)
插入排序不用額外的儲存空間,因此是原地排序。
插入排序可以讓兩數相等的情況下前後不進行交換,所以是穩定的排序演算法。
3.選擇排序
選取後邊區間最小的數,與第乙個數進行交換 ,第二小的與第二個數交換
**如下:
/**
*選擇排序
* @param array
* @return
*/public static int selectsort(int array)}}
return array;
}
選擇排序無論如何都會把兩輪迴圈走完,最好,最壞,平均時間複雜度都是o(n2)
選擇排序也沒有用到新的空間,所以也是原地排序
然後每次挑選最小的,與i位置的資料交換,有可能相同的數前後順序會有改變,比如9,9,2,5,1 第乙個9就會到第二個9後邊
2 排序演算法 快速排序
問題描述 利用快速排序演算法對下列例項排序,在演算法執行過程中,寫出陣列 a第一次排序後被分割的過程。a 65,70,75,80,85,55,50,2 解題思想 在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大的記錄一次就能交換到後面的單元,總的比較和移動次數較少。對於輸入的陣列a p...
2 排序演算法 氣泡排序
氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。作為最簡單...
演算法筆記2 排序
1.選擇排序 首先,找到陣列中最小的那個元素,其次,將他和陣列第乙個元素交換位置,再次,在剩下的元素中找到最小的元素,將他和陣列的第二個元素交換位置。如此反覆,直到將整個陣列排序。不斷的選擇剩餘元素的最小值 2.插入排序 對部分有序陣列很有效 為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入...