四 歸併排序 快速排序

2022-03-26 04:15:16 字數 2414 閱讀 5784

* 歸併排序

* @param arr 排序資料

* @param n 陣列大小

*/public static void merge_sort(int arr, int n)

// 遞迴呼叫函式

public static void merge_sort_c(int arr, int p, int r)

// 取p到r之間的中間位置q

int q = (p + r) / 2;

// 分治遞迴

merge_sort_c(arr, p, q);

merge_sort_c(arr, q + 1, r);

// 將 arr[p...q] 和 arr[q+1...r] 合併為 arr[p...r]

merge(arr[p...r],arr[p...q],arr[q + 1...r]);

}

/**

* merge 合併函式

* @param arr 陣列

* @param p 陣列頭

* @param q 陣列中間位置

* @param r 陣列尾

*/public static void merge(int arr, int p, int q, int r) else

}// 判斷哪個子陣列中有剩餘的資料

int start = i, end = q;

if (j <= r)

// 將剩餘的資料拷貝到臨時陣列tmp

while (start <= end)

// 將tmp中的陣列拷貝回 arr[p...r]

* 快速排序

* @param arr 排序陣列

* @param p 陣列頭

* @param r 陣列尾

*/public static void quicksort(int arr, int p, int r)

partition() 分割槽函式:partition() 的實現有兩種方式:

/**

* 分割槽函式方式一

* * @param arr 陣列

* @param p 上標

* @param r 下標

* @return 函式返回 pivot 的下標

*/public static int partition1(int arr, int p, int r)

// 大於 pivot 的存入 yarr 陣列

if (arr[i] > pivot)

}int q = x + p;

// 再將陣列 x 和陣列 y 中資料順序拷貝到 arr[p…r]

for (int i = 0; i < x; i++)

arr[q] = pivot;

for (int i = 0; i < y; i++)

return q;

}

另外一種有點類似選擇排序。

/**

* 分割槽函式方式二

* @param arr 陣列

* @param p 上標

* @param r 下標

* @return 函式返回pivot的下標

歸併排序

快速排序

排序思想

處理過程由下到上,先處理子問題,然後在合併

由上到下,先分割槽,在處理子問題

穩定性是

否空間複雜度

q(n)

q(1) 原地排序演算法

時間複雜度

都為 o(nlogn)

平均為 o(nlogn),最差為 o(n²)

快速排序 歸併排序

感覺好久之前不寫這些基礎的東西忽然覺著,想複習一下,就簡單溫習一下排序的例子 package com.ruishenh.algoritmic public class sort static void printmsg int arrs system.out.println static int g...

快速排序,歸併排序

快速排序 quicksort 是對 氣泡排序的一種改進。設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。需要注意的是,多個相同的值的相對位置也許會在演算法結束時產...

歸併排序,快速排序

快速排序實現 filename fastsort description author hcq createtime 2019 04 12 10 01 public class fastsort arrays.stream arr foreach v system.out.println 排序後 s...