bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

算法基礎之歸并排序-創新互聯

本文概述:
  • 文章以歸并排序為題,向讀者介紹了其整體思路、時間復雜度分析、核心代碼算法思路,并提供了完整實現代碼(C++ & Java)。
樣例展示:

image-20221223151949764

創新互聯專注于耿馬企業網站建設,響應式網站,商城建設。耿馬網站建設公司,為耿馬等地區提供建站服務。全流程按需規劃網站,專業設計,全程項目跟蹤,創新互聯專業和態度為您提供的服務整體思路:先分治,再合并
  • 算法整體上:

    • 將原數組,以數組下標中點為分界點,一分為二
  • 遞歸的每一層:

    • 數據來源:nums[left,right],分出的兩部分nums[left,mid],nums[mid + 1,right]

    • 排序操作:遍歷兩部分,按照大小,將其放入臨時數組temp[],注意下標從0 開始;

    • 放回操作:將排好序的臨時數組元素放回本層原數組

      • 遍歷的區間的對應關系應為

        • nums:[left,right]
        • temp:從零開始,因為在每一層的排序時,temp 都是從0 開始的
時間復雜度分析
  • 歸并是穩定的,在遞歸排序時,每一趟會將原數組劃分為兩份,對于N 個數據,總計為logN層;
  • 對每一層,均會進行合并(掃描一遍,每一次會掃描right - left + 1個數),因此總體為N * logN
核心代碼算法思路:一共四步
  • 第一步:確定分界點下標

    int mid = (left + right) >>1;

  • 第二步:向下遞歸,將本層數據以分界點為線,一分為二

    merge_sort(nums,left,mid),merge_sort(nums,mid + 1,right);

  • 第三步:將由本層分裂出的左右兩部分數組按照大小進行合并

    • 注意:第二步是遞歸向下的過程,此時遞歸深度不斷加深,第三步是遞歸向上,此時為遞歸回溯操作
    //開始合并兩個數組
    int k = 0,startA = left,startB = mid + 1;
    while(startA<= mid && startB<= right)
    {if(nums[startA]< nums[startB]) temp[k++] = nums[startA++];
        else(temp[k++] = nums[startB++]);
    }
    ?
    while(startA<= mid)    temp[k++] = nums[startA++];
    while(startB<= right)    temp[k++] = nums[startB++];
  • 第四步:將本層存放在臨時數組中的元素,放回原數組

    • 注意:此時,處理的是遞歸中的某一層,且臨時數組中保存的數據是排好序的;

    • 因此,遍歷的區間的對應關系應為

      • nums:[left,right]
      • temp:從零開始,因為在每一層的排序時,temp 都是從0 開始的

    for(int startA = left,startB = 0;startA<= right;startA++,startB++) nums[startA] = temp[startB];

代碼實現:C++
#include?
using namespace std;
?
const int N  = 1e6 + 10;
?
int n;
int nums[N], temp[N];
?
void merge_sort(int nums[],int left,int right)
{if(left >= right)   return;//遞歸出口
?
    //本層遞歸邏輯
    int mid = (left + right) >>1;//確定分界點下標
    merge_sort(nums,left,mid),merge_sort(nums,mid + 1,right);//向下遞歸
?
    //開始合并兩個數組
    int k = 0,startA = left,startB = mid + 1;
    while(startA<= mid && startB<= right)
    {if(nums[startA]< nums[startB]) temp[k++] = nums[startA++];
        else(temp[k++] = nums[startB++]);
    }
?
    while(startA<= mid)    temp[k++] = nums[startA++];
    while(startB<= right)    temp[k++] = nums[startB++];
?
    //將本段區間的有序結果放回原數組
    for(int startA = left,startB = 0;startA<= right;startA++,startB++) nums[startA] = temp[startB];
?
    //for (int i = 0;i< n;i++)   nums[i] = temp[i];注意,放回的是本段區間[left,right] 不是整個區間
?
}
?
int main()
{scanf("%d",&n);
    for(int i = 0;i< n;i++) scanf("%d",&nums[i]);//處理IO
?
    merge_sort(nums,0,n - 1);//進行歸并排序
?
    for(int i = 0;i< n;i++)    printf("%d ",nums[i]);
?
}
?
?
?
作者:WAsbry
鏈接:https://www.acwing.com/activity/content/code/content/353277/
來源:AcWing
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
代碼實現:Java
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner;
?
public class MergeSort {?
    //核心函數:使用歸并排序對給定數組的指定區間進行升序排序
    public void merge_sort(int[] nums, int left, int right){//遞歸出口
        if (left >= right)  return;
?
        //本層遞歸邏輯
        int mid = (left + right) >>1;//選擇本層遞歸數組下標中點作為分界
        merge_sort(nums,left,mid);
        merge_sort(nums,mid + 1,right);//向下遞歸
?
        //將本層原數組分裂出的兩部分升序合并在臨時數組中
        int startA = left,startB = mid + 1;//確定兩部分起點
        ArrayListtemp = new ArrayList<>();//臨時集合
?
        while (startA<= mid &&startB<= right){if(nums[startA]< nums[startB]){temp.add(nums[startA++]);
            }else {temp.add(nums[startB++]);
            }
        }
        while (startA<= mid){temp.add(nums[startA++]);
        }
        while (startB<= right){temp.add(nums[startB++]);
        }
?
        //將臨時數組中的升序序列放回原數組
        for(startA = left,startB = 0;startA<= right;startA++,startB++){nums[startA] = temp.get(startB);
        }
    }
?
    //輔助函數:打印給定數組所有元素
    public void printArray(int[] nums){for (int i = 0;i< nums.length;i++){System.out.print(nums[i] + " ");
        }
    }
?
    //輔助函數:根據鍵盤輸入初始化數組nums,并返回nums;輸入:1,2,3;返回nums{1,2,3}
    public int[] dealIO(){Scanner sc = new Scanner(new BufferedInputStream(System.in));
        String str = sc.next();
        String[] strArray = str.split(",");
?
        int[] nums = new int[strArray.length];
        for (int i = 0;i< strArray.length;i++){nums[i] = Integer.valueOf(strArray[i]);
        }
?
        return nums;
    }
?
?
    public static void main(String[] args) {MergeSort ma = new MergeSort();
        int[] nums = ma.dealIO();
        ma.merge_sort(nums,0,nums.length - 1);
        ma.printArray(nums);
    }
}
?
運行截圖:Java

image-20221224135817213

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前題目:算法基礎之歸并排序-創新互聯
文章起源:http://vcdvsql.cn/article12/jsegc.html

成都網站建設公司_創新互聯,為您提供網站維護、網站內鏈、品牌網站建設、App設計微信公眾號、品牌網站制作

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司