欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析java 歸并排序算法

 更新時(shí)間:2015年02月02日 11:22:17   投稿:hebedich  
這篇文章主要簡(jiǎn)單介紹了java 歸并排序算法的工作原理及代碼,需要的朋友可以參考下

歸并排序(Merge)是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。

歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。 將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為2-路歸并。

歸并排序算法穩(wěn)定,數(shù)組需要O(n)的額外空間,鏈表需要O(log(n))的額外空間,時(shí)間復(fù)雜度為O(nlog(n)),算法不是自適應(yīng)的,不需要對(duì)數(shù)據(jù)的隨機(jī)讀取。

工作原理:

1、申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列

2、設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置

3、比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置

4、重復(fù)步驟3直到某一指針達(dá)到序列尾

5、將另一序列剩下的所有元素直接復(fù)制到合并序列尾

運(yùn)行代碼

復(fù)制代碼 代碼如下:

package com.zc.manythread;
import java.util.Random;
/**
 * 歸并排序
 * @author 偶my耶
 *
 */
public class MergeSort {
    public static void mergeSort(int[] data) {
        sort(data, 0, data.length - 1);
    }
    public static void sort(int[] data, int left, int right) {
        if (left >= right)
            return;
        // 找出中間索引
        int center = (left + right) / 2;
        // 對(duì)左邊數(shù)組進(jìn)行遞歸
        sort(data, left, center);
        // 對(duì)右邊數(shù)組進(jìn)行遞歸
        sort(data, center + 1, right);
        // 合并
        merge(data, left, center, right);
        print(data);
    }
    /**
     * 將兩個(gè)數(shù)組進(jìn)行歸并,歸并前面2個(gè)數(shù)組已有序,歸并后依然有序
     *
     * @param data
     *            數(shù)組對(duì)象
     * @param left
     *            左數(shù)組的第一個(gè)元素的索引
     * @param center
     *            左數(shù)組的最后一個(gè)元素的索引,center+1是右數(shù)組第一個(gè)元素的索引
     * @param right
     *            右數(shù)組最后一個(gè)元素的索引
     */
    public static void merge(int[] data, int left, int center, int right) {
        // 臨時(shí)數(shù)組
        int[] tmpArr = new int[data.length];
        // 右數(shù)組第一個(gè)元素索引
        int mid = center + 1;
        // third 記錄臨時(shí)數(shù)組的索引
        int third = left;
        // 緩存左數(shù)組第一個(gè)元素的索引
        int tmp = left;
        while (left <= center && mid <= right) {
            // 從兩個(gè)數(shù)組中取出最小的放入臨時(shí)數(shù)組
            if (data[left] <= data[mid]) {
                tmpArr[third++] = data[left++];
            } else {
                tmpArr[third++] = data[mid++];
            }
        }
        // 剩余部分依次放入臨時(shí)數(shù)組(實(shí)際上兩個(gè)while只會(huì)執(zhí)行其中一個(gè))
        while (mid <= right) {
            tmpArr[third++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[third++] = data[left++];
        }
        // 將臨時(shí)數(shù)組中的內(nèi)容拷貝回原數(shù)組中
        // (原left-right范圍的內(nèi)容被復(fù)制回原數(shù)組)
        while (tmp <= right) {
            data[tmp] = tmpArr[tmp++];
        }
    }
    public static void print(int[] data) {
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + "\t");
        }
        System.out.println();
    }
    /**
     * 產(chǎn)生隨機(jī)數(shù)組
     * @param count
     * @return
     */
    private static int[]  createDate(int count) {
        int[] data=new int[count];
          Random rand = new Random();
          boolean[] bool = new boolean[100];
          int num = 0;
          for (int i = 0; i < count; i++) {
           do {
            // 如果產(chǎn)生的數(shù)相同繼續(xù)循環(huán)
            num = rand.nextInt(100);
           } while (bool[num]);
           bool[num] = true;
           data[i]=num;
          }
          return data;
    }
    public static void main(String[] args) {
        int[] data = createDate(10);
        print(data);
        mergeSort(data);
        System.out.println("排序后的數(shù)組:");
        print(data);
    }
}

運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容了,希望小伙伴能夠喜歡。

相關(guān)文章

  • Java Spring的refresh方法你知道嗎

    Java Spring的refresh方法你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java Spring的refresh方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java?@Accessors注解圖文詳解

    Java?@Accessors注解圖文詳解

    @Accessors用于改變@Data生成的getter和setter方法的生成結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Java?@Accessors注解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序

    聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序

    這篇文章主要介紹了聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • RabbitMQ進(jìn)階之消息可靠性詳解

    RabbitMQ進(jìn)階之消息可靠性詳解

    這篇文章主要介紹了RabbitMQ進(jìn)階之消息可靠性詳解,abbitmq消息的投遞過(guò)程中,怎么確保消息能不丟失,這是一個(gè)很重要的問(wèn)題,哪怕我們做了Rabbitmq持久化,也不能保證我們的業(yè)務(wù)消息不會(huì)被丟失,需要的朋友可以參考下
    2023-08-08
  • java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解

    java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解

    這篇文章主要介紹了java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解,對(duì)常量池的好處以及基本類型的包裝類常量池等作了簡(jiǎn)要分析,有需要的朋友可以借鑒參考下
    2021-09-09
  • http中g(shù)et請(qǐng)求與post請(qǐng)求區(qū)別及如何選擇

    http中g(shù)et請(qǐng)求與post請(qǐng)求區(qū)別及如何選擇

    這篇文章主要介紹了http中g(shù)et請(qǐng)求與post請(qǐng)求在應(yīng)用中應(yīng)該如何選擇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置指南

    SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置指南

    這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置的相關(guān)資料,在Java SpringBoot項(xiàng)目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會(huì)打印日志,需要的朋友可以參考下
    2023-10-10
  • spring boot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的方法

    spring boot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的方法

    這篇文章主要介紹了spring boot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java客戶端利用Jedis操作redis緩存示例代碼

    Java客戶端利用Jedis操作redis緩存示例代碼

    Jedis是Redis官方推薦的用于訪問(wèn)Java客戶端,下面這篇文章主要給大家介紹了關(guān)于Java客戶端利用Jedis操作redis緩存的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07

最新評(píng)論