15 快速排序和歸併排序

2021-09-16 19:43:38 字數 2542 閱讀 2275

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...