第四周 歸併演算法

2022-07-26 18:21:11 字數 1238 閱讀 6275

歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:

1)劃分子表

2)合併半子表 

///

/// 歸併排序之歸:歸併排序入口

/// updated by lihua at 05/06/2009

///

/// 無序陣列

/// 有序陣列

/// lihua

static int sort(int data)

//取陣列中間下標

//int middle = data.length / 2; //方法一:除2取整數

int middle = data.length >> 1;  //方法二:位移 (感謝讀者hyper給出的這個效率稍高的方法)

//初始化臨時陣列let,right,並定義result作為最終有序陣列,若陣列元素奇數個,將把多餘的那元素空間預留在right臨時陣列

int left = new int[middle], right = new int[data.length - middle], result = new int[data.length];

//經調查,用array.copy的確比上面的for迴圈優化很多

array.copy(data, 0, left, 0, middle);//拷貝左陣列

array.copy(data, left.length, right, 0, right.length); //拷貝右陣列

left = sort(left);//遞迴左陣列

right = sort(right);//遞迴右陣列

result = merge(left, right);//開始排序

輸出排序,測試用(lihua debug)

return result;

}///

/// 歸併排序之並:排序在這一步

///

/// 左陣列

/// 右陣列

/// 合併左右陣列排序後返回

static int merge(int a, int b)

else//左陣列中元素大於右陣列中元素

}while (i < a.length)//這裡其實是還有左元素,但沒有右元素

while (j < b.length)//右右元素,無左元素

return result;//返回結果陣列

}

演算法作業 7 2017 3 16第四周

解析 方法一 這道題給了我們乙個陣列,又給了該陣列的乙個子集合,讓我們求集合中每個數字在原陣列中右邊第乙個較大的數字。可以先採用暴力搜尋,遍歷子集合中的每乙個數字,然後在原陣列中找到這個數字,然後向右遍歷,找到第乙個大於該數字的數即可,如下 class solution for k j 1 k nu...

第四周作業

第四周實驗作業 1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 1.1求自然對數e的近似值 include using namespace std int main cout 1.2求圓周率 的近似值 include using name...

第四周作業

實驗作業1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 2.程式設計求 百錢百雞 問題。雞翁一值錢五,雞母 一值錢三,雞雛三值錢一。百錢買百雞,問雞翁 雞母 雞雛各幾何?3.程式設計輸入乙個整數,計算它是幾位數字,分別輸出每一位數字,並輸...