1. 程式人生 > >【從頭開始學演算法】歸併排序

【從頭開始學演算法】歸併排序

需求:將陣列中元素排序

思路:將陣列拆分成若干一個元素的小陣列,陣列兩兩合併,

與之前的排序方法不同在於,歸併排序,需要額外的空間,用來臨時存放合併後的小陣列

	public static void MergeSort(int[] arr, int first, int last) {
		System.out.println("MergeSort"+first+last);
		int mid = 0;
		if (last - first > 1) {
			mid = (last + first) / 2;
			MergeSort(arr, first, mid);//排序中認為最右端不可達,所以,mid不能+1;
		
			MergeSort(arr, mid , last);
			Merge(arr, first, mid, last);
		}

	}

	private static void Merge(int[] arr, int first, int mid, int last) {
		System.out.println("Merge"+first+mid+last);
		int[] arr1 = new int[last - first + 1];
		int i = first;
		int j = mid;
		int n = 0;
		while (i < mid && j < last) {
			if (arr[i] <= arr[j]) {
				arr1[n] = arr[i];
				i++;
				n++;
			} else {
				arr1[n] = arr[j];
				j++;
				n++;
			}
		}
		while (i < mid) {
			arr1[n] = arr[i];
			i++;
			n++;
		}
		while (j < last) {
			arr1[n] = arr[j];
			j++;
			n++;
		}
		int a = 0;
		for (int x = first; x <last; x++) {
			arr[x] = arr1[a++];
		}
		arr1 = null;
	}

這個其實不難理解,就是順著一支向下拆,拆到最下邊向上合併,合併完這一支的元素,繼續拆下一支(計算機做的順序)

過程如圖,以陣列下標0-7為例,黑色為拆分過程,黃色為合併過程,框中數字為矩陣下標,線上數字為處理順序

時間複雜度:O(nlogn)

空間複雜度:O(n)

相關推薦

從頭開始演算法歸併排序

需求:將陣列中元素排序 思路:將陣列拆分成若干一個元素的小陣列,陣列兩兩合併, 與之前的排序方法不同在於,歸併排序,需要額外的空間,用來臨時存放合併後的小陣列 public static void MergeSort(int[] arr, int first, int

排序演算法歸併排序(C++)

歸併排序的遞迴實現 C++ class MergeSort { public: int* mergeSort(int* A, int n) { // write code he

NOJ1002演算法實驗一分治演算法歸併排序

1002.歸併排序 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 給定一個數列,用歸併排序演算法把它排成升序。 輸入 第一行是一個整數n(n不大於10000),表示要排序的數的個數; 下面一行是用空格隔開的n個整數。 輸出

演算法歸併排序演算法的java實現

歸併排序的核心程式碼: private static void mergeSort(int[] a, int i, int j) { if (i < j) { int mid =

排序演算法歸併排序原理及Java實現

1、基本思想: 歸併排序就是利用歸併的思想實現的排序方法。而且充分利用了完全二叉樹的深度是的特性,因此效率比較高。其基本原理如下:對於給定的一組記錄,利用遞迴與分治技術將資料序列劃分成為越來越小的半子表,在對半子表排序,最後再用遞迴方法將排好序的半子表合併成為

Java常用排序演算法歸併排序(二路歸併排序

歸併排序的思路 歸併排序是通過“歸併”操作完成排序的,將兩個或者多個有序子表歸併成一個子表。歸併排序是“分治法”的一個非常典型的應用,同時它也是遞迴演算法的一個好的例項。它將問題分成一些小的問題然後遞

資料結構與演算法內部排序之四:歸併排序和快速排序(含完整原始碼)

前言      之所以把歸併排序和快速排序放在一起探討,很明顯兩者有一些相似之處:這兩種排序演算法都採用了分治的思想。下面來逐個分析其實現思想。歸併排序實現思想       歸併的含義很明顯就是將兩個或者兩個以上的有序表組合成一個新的有序表。歸併排序中一般所用到的是2-路歸併

排序演算法歸併排序(C++實現)

歸併排序是利用"歸併"技術來進行排序。歸併是指將若干個已排序的子檔案合併成一個有序的檔案。常見的歸併排序有兩路歸併排序(Merge Sort),多相歸併排序(Polyphase Merge Sort)

分治演算法歸併排序,快速排序和漢諾塔

1介紹 分治演算法已經是本人所寫的常用算法系列的第三個了,可能只會寫這一節,對比動態規劃與貪心演算法我們來認識一下分治演算法。 從思路上來看: (1)動態規劃:多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。每一個階段的最優解是基於前一個階段的最優解。

資料結構與演算法插入排序

 插入排序是演算法中的基礎入門和氣泡排序、選擇排序都是必要掌握的。他們都是對比排序,需要通過比較大小交換位置,進行排序。 插入排序的實現思路: 1、 從第一個元素開始,這個元素可以認為已經被排序。 2、取出下一個元素,在已排序的序列中從後往前掃描。 3、如果該元素小於小於前

資料結構與演算法 ---快速排序

快速排序流程: 1.從數列中挑出一個基準值 2.將所有比基準值小的擺放在基準前面,所有比基準值大的擺在後面(相同的數可以放到任一邊);在這個分割槽退出之後,該基準就處於數列的中間位置。 3.遞迴地把“基準值前面的子數列”和“基準值後面的子數列”進行排序。   下面以數列

資料結構與演算法------氣泡排序

 學習開發一年的時間裡,很少去了解排序演算法,氣泡排序也是最開始學習的樣子,靠死記硬背,沒有引入自己的理解。  對於什麼時間複雜度和空間複雜度和穩定性也不清楚其原委,或許在程式碼方面少了幾許的天分: 氣泡排序: 氣泡排序每一輪的比較都是前面的數和後面的數進行比較,並交

資料結構與演算法排序全家桶(十大排序詳解及其Java實現)---第七篇

本篇文章彙總了10種場常見的排序演算法,篇幅較長,可以通過下面的索引目錄進行定位查閱: 7、桶排序 一、排序的基本概念 1、排序的定義 排序:就是使一串記錄,按照其中的某個或者某些關鍵字的大小,遞增或遞減的排列起來

資料結構與演算法八大排序整理(python+java)

1.氣泡排序 氣泡排序很簡單,就是從第一個數開始,把數依次和後面一個數比較,大的數交換位置,直到陣列中最後一個數。 與此同時用end限定陣列的結尾。 arry = [2,4,6,8,1,9,0] def swap(arry,i,j): tem = ar

資料結構與演算法003—排序演算法(Python)

寫在前面 常見排序演算法可以分為兩大類: 非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。 線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比

資料結構、演算法八大排序演算法概述(演算法複雜度、穩定性)

前言   排序是計算機程式設計中一個非常重要的操作,它將一個數據元素(或記錄)的任意序列重新排列成一個按關鍵字有序的序列。在有序的序列中查詢元素的效率很高,(例如,折半查詢法的平均查詢長度為log2(n+1)−1log2(n+1)−1),但是無序序列只能逐一查

大話資料結構&演算法氣泡排序

起泡排序又稱為氣泡排序。它是通過一系列的“交換”動作完成的。首先將第一和第二個記錄進行比較,如果第一個記錄大於第二個記錄,則兩者交換位置,否則保持原位置不變;然後比較第二和第三個記錄……一直按這種方式比較下去,最終最大的記錄被交換到最後,一趟氣泡排序完成。這個過

從頭開始演算法:考研機試題練習(C/C++)--基礎知識

從頭開始學演算法:考研機試題練習(C/C++)–基礎知識 最近重學c語言,刷的是胡凡寫的《演算法筆記》,這本書的題主要是面向考研機試和一般演算法考試的,零基礎入門,還不錯,在此記錄學習過程。 本文回顧c語言的I/0操作和字元字串操作等基礎知識。 #incl

小白演算法2. 稀疏陣列

### 一、什麼是稀疏陣列 當一個數組a中大部分元素為0,或者為同一個值,那麼可以用稀疏陣列b來儲存陣列a。 首先,稀疏陣列是一個數組,然後以一種特定的方式來儲存上述的陣列a,具體處理方法: * 記錄陣列a一共有幾行幾列 * 記錄a中有多少個不同的值 * 最後記錄不同值的元素所在行列,以及具體的值,放在一個

小白演算法3. 佇列

### 一、什麼是佇列 * 佇列是一個有序列表,可以用陣列或者連結串列來實現。 * 遵循**先入先出**的原則,即:先存入佇列的資料,要先取出。後存入的的資料,後取出。 看一張佇列的模擬圖,1,2,3表示同一個佇列Queue。 在佇列中有2個指標,front表示隊首,rear表示隊尾。 1. 圖1中表示佇列