首页 > 编程语言 >排序算法之归并排序

排序算法之归并排序

时间:2023-02-01 17:37:07浏览次数:64  
标签:归并 下标 temp int arr 算法 数组 排序

思路:

利用递归的方式将数组不停的拆解,直到无法拆分为止。然后将其中的两个数组(拆解后的子数组)进行两两合并成一个有序数组,直到两个子数组合并后就是原数组则结束。

 

 具体两个数组如何合并成一个有序数组如下:

代码:

 1     /**
 2      * 归并排序
 3      * @param arr    需排序的数组
 4      * @param left   当前数组最左边的下标
 5      * @param right  当前数组最右边的下标
 6      * @param temp   临时数组
 7      */
 8     public static void mergeSort(int[] arr, int left, int right, int[] temp) {
 9         if (arr == null || arr.length == 0 || temp == null || temp.length == 0) {
10             return;
11         }
12         if (left >= right) {
13             return;
14         }
15 
16         //分:
17         //拆分数组的中轴
18         int pivot = (left + right) / 2;
19         //向左拆分
20         mergeSort(arr, left, pivot, temp);
21         //向右拆分
22         mergeSort(arr, pivot + 1, right, temp);
23 
24         //合:
25         //左边数组未排序中第一个元素的下标
26         int leftFirstIndex = left;
27         //左边数组最后一个元素的下标
28         int leftLastIndex = pivot;
29         //右边数组未排序中第一个元素的下标
30         int rightFirstIndex = pivot + 1;
31         //右边数组最后一个元素的下标
32         int rightLastIndex = right;
33         //临时数组未放入元素的第一个下标
34         int tempIndex = 0;
35         //将左边的有序数组和右边的有序数组按从小到大的顺序排入临时数组,直到某边数组的元素全部排完
36         while (leftFirstIndex <= leftLastIndex && rightFirstIndex <= rightLastIndex) {
37             if (arr[leftFirstIndex] <= arr[rightFirstIndex]) {
38                 //将较小的左边未排序的第一个元素追加到临时数组,leftFirstIndex后移一位
39                 temp[tempIndex] = arr[leftFirstIndex];
40                 leftFirstIndex++;
41             } else {
42                 //将较小的右边未排序的第一个元素追加到临时数组,rightFirstIndex后移一位
43                 temp[tempIndex] = arr[rightFirstIndex];
44                 rightFirstIndex++;
45             }
46             //tempIndex所指向的位置放了值,所以需后移一位
47             tempIndex++;
48         }
49         if (leftFirstIndex > leftLastIndex) {
50             //左边数组先排完,将右边数组剩下的值依次放入临时数组
51             while (rightFirstIndex <= rightLastIndex) {
52                 temp[tempIndex] = arr[rightFirstIndex];
53                 rightFirstIndex++;
54                 tempIndex++;
55             }
56         }
57         if (rightFirstIndex > rightLastIndex) {
58             //右边数组先排完,将左边数组剩下的值依次放入临时数组
59             while (leftFirstIndex <= leftLastIndex) {
60                 temp[tempIndex] = arr[leftFirstIndex];
61                 leftFirstIndex++;
62                 tempIndex++;
63             }
64         }
65         //临时数组未复制的第一个元素下标
66         int toCopyIndex = 0;
67         //将临时数组已排好序的元素复制到arr对应的位置[left, right]
68         while (left <= right) {
69             arr[left] = temp[toCopyIndex];
70             left++;
71             toCopyIndex++;
72         }
73     }

 

标签:归并,下标,temp,int,arr,算法,数组,排序
From: https://www.cnblogs.com/xueseng/p/17083527.html

相关文章

  • LRU和LFU缓存置换算法
    对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内......
  • 二分查找算法实现(图解)与实例
    前言当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫折半查找。 它对要查找的序列有两个要求,一是该序列必须是有序的(即该序列中......
  • 冒泡排序(Bubble Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 选择排序(Selection Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 插入排序(Insertion Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 十大经典排序算法
    0、算法概述0.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序......
  • 0_算法的概念以及算法计时
    算法就是计算或解决问题的步骤,算法的运行时间使用解决某个问题使用的“步数”,1步就是计算的基本单位。作为示例,现在我们试着从理论层面求出选择排序的运行时间。......
  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......
  • 广度优先搜索算法 BFS 实战 All In One
    广度优先搜索算法BFS实战AllInOneBreadth-FirstSearch/BFSBFS/广度优先搜索/广度优先遍历/按层次遍历树demosLeetCode"usestrict";/****......
  • 使用java python 实现 QI-页面排序-骑马钉
    链接:http://www.cnprint.org/bbs/thread/77/339531/......