最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

老生常談比較排序之歸并排序(遞歸)

 更新時間:2017年06月24日 08:11:14   投稿:jingxian  
下面小編就為大家?guī)硪黄仙U劚容^排序之歸并排序(遞歸)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

歸并排序里運用到算法里很重要的一個思想——分治法:將原問題分解為幾個規(guī)模較小但類似于原問題的子問題——《算法導論》。

在每一層遞歸中都有3個步驟:

1.分解問題

2.解決問題

3.合并問題的解

舉例待排序數組:{6, 5, 3, 1, 7, 2, 4},將它原始序列做分解。

可以經過不斷的遞歸分解可以看到已經把原始數組序列不斷分解為最小單位,接下來不妨將它們看做是二叉樹的葉子節(jié)點。

    

將他們進行兩兩歸并排序形成二叉樹(也稱為2路歸并算法),可見二叉樹的根節(jié)點即為最終序列。在這個過程中我們完成了剩余的兩個步驟:解決問題和合并問題。

理論很簡單,實踐很“復雜”。對于歸并排序的理論從上面的二叉樹就看的很明白,將原始待排序數組不斷分解最后看成是二叉樹的葉子節(jié)點,再把它們兩兩排形成新的節(jié)點,逐漸歸并為一個節(jié)點,此時的節(jié)點即為排好序的數組序列。

Java

package com.algorithm.sort.merge;

import java.util.Arrays;

/**
 * 歸并排序(遞歸)
 * Created by yulinfeng on 2017/6/23.
 */
public class Merge {
  public static void main(String[] args) {
    int[] nums = {6, 5, 3, 1, 7, 2, 4};
    nums = mergeSort(nums);
    System.out.println(Arrays.toString(nums));
  }

  /**
   * 歸并排序
   * @param nums 待排序數組序列
   * @return 排好序的數組序列
   */
  private static int[] mergeSort(int[] nums) {
    segment(nums, 0, nums.length - 1);
    return nums;
  }

  /**
   * 遞歸切分待排
   * @param nums 待切分數組
   * @param left 待切分最后第一個元素的索引
   * @param right 待切分數組最后一個元素的索引
   */
  private static void segment(int[] nums, int left, int right) {
    if (left >= right)
      return;
    // 找出中間索引
    int center = (left + right) / 2;
    // 對左邊數組進行遞歸
    segment(nums, left, center);
    // 對右邊數組進行遞歸
    segment(nums, center + 1, right);
    // 合并
    merge(nums, left, center, right);
  }

  /**
   * 兩兩歸并排好序的數組(2路歸并)
   * @param nums 帶排序數組對象
   * @param left 左邊數組的第一個索引
   * @param center 左數組的最后一個索引,center + 1右數組的第一個索引
   * @param right 右數組的最后一個索引
   */
  private static void merge(int[] nums, int left, int center, int right) {
    int[] tmpArray = new int[nums.length];
    int rightIndex = center + 1;  // 右數組第一個元素索引
    int tmpIndex = left;  //臨時數組索引
    int begin = left;  // 緩存左數組第一個元素的索引,用于將排好序的數組拷貝回原數組
    while (left <= center && rightIndex <= right) {
      if (nums[left] <= nums[rightIndex]) {
        tmpArray[tmpIndex++] = nums[left++];
      } else {
        tmpArray[tmpIndex++] = nums[rightIndex++];
      }
    }
    while (left <= center) {
      tmpArray[tmpIndex++] = nums[left++];
    }
    while (rightIndex <= right) {
      tmpArray[tmpIndex++] = nums[rightIndex++];
    }
    while (begin <= right) {
      nums[begin] = tmpArray[begin++];
    }
  }
}

Python3

#二路歸并排序(遞歸)
def merge_sort(nums):
  segment(nums, 0, len(nums) - 1)
  return nums

#切分待排序數組
def segment(nums, left, right):
  if left >= right:
    return
  center = int((left + right) / 2)
  segment(nums, left, center)
  segment(nums, center + 1, right)
  merge(nums, left, center, right)

#兩兩歸并排好序的數組(二路歸并)
def merge(nums, left, center, right):
  tmpArray = [0] * len(nums)
  rightIndex = center + 1   #右數組的第一個元素索引
  tmpIndex = left
  begin = left
  while left <= center and rightIndex <= right:
    if nums[left] <= nums[rightIndex]:
      tmpArray[tmpIndex] = nums[left]
      tmpIndex += 1
      left += 1
    else:
      tmpArray[tmpIndex] = nums[rightIndex]
      tmpIndex += 1
      rightIndex += 1
  while left <= center:
    tmpArray[tmpIndex] = nums[left]
    tmpIndex += 1
    left += 1
  while rightIndex <= right:
    tmpArray[tmpIndex] = nums[rightIndex]
    tmpIndex += 1
    rightIndex += 1
  while begin <= right:
    nums[begin] = tmpArray[begin]
    begin += 1

nums = [6, 5, 3, 1, 7, 2, 4]
nums = merge_sort(nums)
print(nums)

以上這篇老生常談比較排序之歸并排序(遞歸)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • javaweb圖書商城設計之訂單模塊(5)

    javaweb圖書商城設計之訂單模塊(5)

    這篇文章主要為大家詳細介紹了javaweb圖書商城設計之訂單模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • idea中文件被Mark as Plain Text后恢復方式

    idea中文件被Mark as Plain Text后恢復方式

    在IntelliJ IDEA中,如果錯誤地將文件標記為純文本(Mark as Plain Text),可以通過在項目目錄中右鍵點擊文件并選擇“Mark as”來恢復原文件類型
    2024-11-11
  • Spring?Boot?中的?Native?SQL基本概念及使用方法

    Spring?Boot?中的?Native?SQL基本概念及使用方法

    在本文中,我們介紹了 Spring Boot 中的 Native SQL,以及如何使用 JdbcTemplate 和 NamedParameterJdbcTemplate 來執(zhí)行自定義的 SQL 查詢或更新語句,需要的朋友跟隨小編一起看看吧
    2023-07-07
  • 詳解用Kotlin寫一個基于Spring Boot的RESTful服務

    詳解用Kotlin寫一個基于Spring Boot的RESTful服務

    這篇文章主要介紹了詳解用Kotlin寫一個基于Spring Boot的RESTful服務 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • JavaWeb工程中集成YMP框架快速上手(二)

    JavaWeb工程中集成YMP框架快速上手(二)

    YMP是一個非常簡單、易用的一套輕量級JAVA應用開發(fā)框架,設計原則主要側重于簡化工作任務、規(guī)范開發(fā)流程、提高開發(fā)效率。對YMP框架感興趣的小伙伴們可以參考一下
    2016-02-02
  • Java利用httpclient通過get、post方式調用https接口的方法

    Java利用httpclient通過get、post方式調用https接口的方法

    這篇文章主要介紹了Java利用httpclient通過get、post方式調用https接口的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java判斷IP地址為內網IP還是公網IP的方法

    Java判斷IP地址為內網IP還是公網IP的方法

    這篇文章主要介紹了Java判斷IP地址為內網IP還是公網IP的方法,針對tcp/ip協(xié)議中保留的三個私有地址進行判斷分析,是比較實用的技巧,需要的朋友可以參考下
    2015-01-01
  • SpringBoot實現yml配置文件為變量賦值

    SpringBoot實現yml配置文件為變量賦值

    這篇文章主要介紹了SpringBoot實現yml配置文件為變量賦值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Springboot hibernate envers使用過程詳解

    Springboot hibernate envers使用過程詳解

    這篇文章主要介紹了Springboot hibernate envers使用過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java注解之Elasticsearch的案例詳解

    Java注解之Elasticsearch的案例詳解

    學會了技術就要使用,否則很容易忘記,因為自然界壓根就不存在什么代碼、變量之類的玩意,這都是一些和生活常識格格不入的東西。這篇文章主要介紹了Java中Elasticsearch的案例,感興趣的可以了解一下
    2022-10-10

最新評論

江安县| 定兴县| 色达县| 江都市| 林芝县| 阿拉善左旗| 安陆市| 和政县| 阿尔山市| 阳江市| 隆子县| 涟水县| 云梦县| 玉环县| 平度市| 宁陵县| 宿迁市| 开化县| 闸北区| 马鞍山市| 寿光市| 措勤县| 安溪县| 航空| 民和| 武川县| 阿拉善左旗| 贵州省| 湖北省| 永康市| 阳春市| 镇沅| 广南县| 鹿邑县| 上杭县| 南澳县| 宣恩县| 弋阳县| 无极县| 乐业县| 温州市|