1、歸併排序的核心思想:我們將把陣列中的元素分成兩部分,對左邊元素進行排序,對右邊元素進行排序。然後對左右兩邊元素,進行歸併操作。
1、歸併排序是穩定的。歸併的過程,如果兩個元素相等,先把左邊的元素進行歸併。
2、歸併排序不是原地排序,需要額外的記憶體空間。o(n)
t(n)=2t(n/2)+o(n);
3、master公式的使用
t(n) = a*t(n/b) + o(n^d)
1) log(b,a) > d -> 複雜度為o(n^log(b,a))
2) log(b,a) = d -> 複雜度為o(n^d * logn)
3) log(b,a) < d -> 複雜度為o(n^d)
歸併排序的執行效率與要排序的原始陣列的有序程度無關,所以其時間複雜度是非常穩定的,不管是最好情況、最壞情況,還是平均情況,時間複雜度都是 o(nlogn)。
2、快速排序核心思想:如果要排序陣列中下標從 p 到 r 之間的一組資料,我們選擇 p 到 r 之間的任意乙個資料作為 pivot(分割槽點)。
我們遍歷 p 到 r 之間的資料,將小於 pivot 的放到左邊,將大於 pivot 的放到右邊,將 pivot 放到中間。
經過這一步驟之後,陣列 p 到 r 之間的資料就被分成了三個部分,前面 p 到 q-1 之間都是小於 pivot 的,
中間是 pivot,後面的 q+1 到 r 之間是大於 pivot 的。
1、快速排序是原地排序,不需要額外的記憶體空間。
2、但是快速排序不是穩定的排序。
3、快速的排序最壞情況是原本有序,o(n^2)
4、最好的情況是分布均勻,o(nlogn)
5、平均時間複雜度是o(n*logn)
/**
* 進行歸併排序 基本思想是:我們把乙個陣列分成兩個部分,左邊排好序,然後右邊的排好序,最後把兩個進行歸併。
** @param array
*/public static void mergesort(int array)
mergesort(array, 0, array.length - 1);
}/**
* l 表示的是要排序的下標最左邊和最右邊
** @param array
* @param l
* @param r
*/private static void mergesort(int array, int l, int r)
int mid = l + ((r - l) >> 1);
mergesort(array, l, mid); //左邊排好序
mergesort(array, mid + 1, r); //右邊排好序
merge(array, l, mid, r); //然後進行歸併
}/**
* 進行歸併的操作
** @param array
* @param l
* @param mid
* @param r
*/private static void merge(int array, int l, int mid, int r) else
}while (p <= mid)
while (q <= r)
for (int i = 0; i < arr.length; i++)
}
/**
* 快速排序的基本思想:
* 取陣列中的第乙個數或者最後乙個數,或者說,是隨機的乙個數,作為值。
* 把小於它的數,放在左邊。大於它的數放在右邊。
* 後面的遞迴實現
** @param data
*/public static void quicksort(int data)
quicksort(data, 0, data.length - 1);
}/**
* @param data
* @param l
* @param r
*/private static void quicksort(int data, int l, int r)
}/**
* 進行資料的劃分,以最後乙個元素為 基準 小於它的元素 放在左邊
* 大於它的放在右邊
** @param data
* @param l
* @param r
* @return
*/private static int partition(int data, int l, int r) else if (data[l] < data[r]) else
}swap(data, more, r);
return new int;
}/**
* 進行資料的交換、
** @param data
* @param i
* @param j
*/private static void swap(int data, int i, int j)
歸併排序和快速排序
歸併排序 先將問題分解為小問題即乙個個子序列,再將子串行按順序合併。class mergesort mergesort a,0 a.length 1 for int t a public static void mergesort int a,int m,int n public static vo...
歸併排序和快速排序
歸併排序的陣列排序任務可以如下完成 1 把前一半排序 2 把後一半排序 3 把兩半歸併到乙個新的有序陣列,然後再拷貝回原陣列,排序完成。include using namespace std void merge int a,int s,int m,int e,int tmp while p1 m ...
快速排序和歸併排序
遞推公式 merge sort p,r merge merge sort p,q merge sort q 1 r 終止條件 p r 10組測試資料 for let i 0 i 10 i 生成10個隨機元素的測試陣列 function gettestdata return ret 排序函式 func...