归并排序(java实现)
1.在講歸并排序之前,我們先復習一下數據結構的基礎知識
? ? ? ?1.數據元素是數據的基本單位,一個數據元素可以是一個不可分割的原子項,也可由多個數據項組成。
? ? ? 2.?數據的邏輯結構主要可分為3種:線性結構(定義數據元素之間是線性關系),樹結構(定義數據元素(結點)之間是層次關系),圖結構(則通過圖形頂點與邊構成的一種結構)。
? ? ?3.算法的5個基本特性:有窮性,確定性,可行性,有輸入,有輸出。
? ? ?4.算法應滿足的5個目標:正確性,健壯性,高時間效率性(根據執行算法的時間來判斷程序的執行效率),高空間性(根據執行算法占用的空間,來判斷程序的執行效率)?,可讀性。?
? ? ?5.算法的優劣主要從時間代價和空間代價來判斷:
? ? ? ? 時間復雜度關系: O(1)<O(log2^n)<O(n)<O(nlog2^n)<O(n^2)<O(n^3)<O(2^n),時間復雜度越小代表該算法執行的效率高,反之亦然,我們在解決的問題當中,不要選擇for循環暴力破解,通過那種方式雖然能解決問題,但是占用的時間太多,我們應該通過別的方式去解決,用空間換時間 用時間換空間都是在不停的更替來使用,目的就是為了追求程序的最優解,就就是算法的魅力所在吧。
? ? ? ? 空間復雜程度我在這里就不一一講解了。
2.接下來我們步入今天的正題,歸并排序:
????????歸并排序的思想是:分而治之,分通俗的講就是將問題分成一個個小的問題,然后通過遞歸的方式求解,讓每的一個元素按照規則出到棧頂;治是歸并排序的最重要一步,將分的階段得到的結果整理放在一起。歸并排序的時間復雜度是:nlog2^n
?簡單的圖示:
3.下面就是歸并排序的代碼實現:
/*** Created with IntelliJ IDEA.** @Author: chenxiky* @Date: 2022/02/16/0:14* @Description: 歸并排序*/ public class MergetSort {public static void main(String[] args) {int arr[] = {8,4,5,7,1,3,6,2};// 歸并排序需要一個額外的空間int temp[] = new int[arr.length];mergeSort(arr,0,arr.length-1,temp);System.out.println("歸并排序="+ Arrays.toString(arr));}// 分+合方法public static void mergeSort(int[]arr,int left,int right,int[] temp){if (left < right){int mid = (left + right)/2; // 中間的索引// 向左遞歸進行分解mergeSort(arr, left, mid, temp);// 向右遞歸進行分解mergeSort(arr, mid+1, right, temp);//合并merge(arr,left,mid,right,temp);}}/*** 合并的方法* @param arr 原始數組* @param left 左邊有序序列的初始索引* @param mid 中間索引* @param right 右邊索引* @param temp 做中轉的數組*/public static void merge(int[] arr,int left,int mid,int right,int[] temp){// 計算進行了多少次歸并System.out.println("xxxx");int i = left; // 初始化i,左邊有序序列的初始索引int j = mid+1; // 初始化j,右邊有序序列的初始索引int t = 0; //指向temp數組的當前索引// 第一步// 先把左右兩邊(有序)的數據按照規則填充到temp數組// 直到左右兩邊的有序序列,有一邊處理完畢為止while (i <= mid && j <= right){// 如果左邊有序序列的當前元素 小于等于右邊有序序列的當前元素// 即將左邊的當前元素拷貝到temp數組// t++;i++; +1操作if (arr[i] <= arr[j]){temp[t] = arr[i];t++; //i++;} else { // 反之將右邊的有序序列的當前元素,填充到temptemp[t] = arr[j];t++;j++;}}//第二步//把有剩余的數據的一邊的數據依次全部填充到tempwhile (i <= mid){ //左邊的有序序列還有剩余的元素,就全填充到temptemp[t] = arr[i];t++;i++;}while (j <= right){ //右邊的有序序列還有剩余的元素,就全填充到temptemp[t] = arr[j];t++;j++;}//第三步//將temp數組的元素拷貝到arr// 注意,并不是每次到拷貝所有的t =0;int tempLeft = left;// 第一次合并時tempLeft=0,right = 3;while (tempLeft <= right){arr[tempLeft] = temp[t];t++;tempLeft++;}} }文中若有錯的地方,請大家多多見諒。如果大家覺得我的內容有收獲可以點擊關注哦,同時也可以關注我的公眾號: 晨溪
總結
以上是生活随笔為你收集整理的归并排序(java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]常用Delphi开发资料网址
- 下一篇: Master DNS服务的搭建