歸併排序也是一種常見的排序算法,下面就讓咱們簡單看一下歸併排序的實現。java
//將給定區間的數組經過新的數組temp進行排序 public static void merge(int[] array, int[] temp, int leftPos, int rightPos, int rightEnd) { int leftEnd = rightPos - 1; int tempPos = leftPos; int length = rightEnd - leftPos + 1; //主要的循環操做 while (leftPos <= leftEnd && rightPos <= rightEnd) { if (array[leftPos] <= array[rightPos]) { temp[tempPos++] = array[leftPos++]; } else { //當leftPos追上rightPos的時候就表明left已經完成排序,而right的剩下值仍需繼續排序。 temp[tempPos++] = array[rightPos++]; } } while (leftPos <= leftEnd) { temp[tempPos++] = array[leftPos++]; } while (rightPos <= rightEnd) { temp[tempPos++] = array[rightPos++]; } //由於array並不必定是從0開始逐漸進行歸併的,因此不能用array[i]=temp[i],只能從結果往前逐漸賦值回去 for (int i = 0; i < length; i++, rightEnd--) { array[rightEnd] = temp[rightEnd]; } } public static void sort(int[] array, int[] temp, int left, int right) { if (left < right) { int center = (left + right) / 2; //不斷的遞歸 sort(array, temp, left, center); sort(array, temp, center + 1, right); merge(array, temp, left, center + 1, right); } } public static void mergeSort(int[] array) { int[] temp = new int[array.length]; sort(array, temp, 0, array.length - 1); }
最優時間複雜度:O(n)算法
平均時間複雜度:O(nlog(n))數組
最壞時間複雜度:O(nlog(n))spa
平均空間複雜度:O(n),網上有網友猜想歸併排序的空間複雜度,有的說是O(n+logn),有的說是O(n),在這裏我認爲在遞歸條件下去進行排序的話,應該是O(n+logn),logn是遞歸棧深度,n是申請的數組。。。非遞歸的話就是n了。。不知道這種理解是否正確,還望指正。code
由於在歸併排序的過程當中咱們不會交換兩個同樣的數字的位置(沒人這麼蛋疼吧),因此整體來看歸併排序是穩定的排序算法。
orm