* 歸併排序
* @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...