首页 > 其他分享 >自然排序

自然排序

时间:2022-11-28 20:01:03浏览次数:34  
标签:right int 自然 len ++ 数组 排序 left


自然排序

       如果数组中部分元素已按自然数顺序排放,例如,数组

自然排序_自然排序

,则初期自然排好序的子数组段显然有4段,分别为

自然排序_java_02


自然排序_分治_03


自然排序_自然排序_04


自然排序_java_05

。请充分利用上述特点设计并实现一个自然合并排序算法,并分析该算法的计算时间复杂度

【分析】

a中的子数组段的开始下标保存在数组b中。接着采用分治的思想,对数组b进行先“分治”后“合并”。如:对于a = {4,9,2,6,1,5,7,3}来说,b = {0,2,4,7}。对b进行分治分为{0,2},{4,7},再进行合并,即{4,9}和{2,6}的合并、{1,5,7}和{3}的合并。最后再将{2,4,6,9}和{1,3,5,7}合并。类似于归并排序算法。同样该算法的时间复杂度为O(n * log n)。

a与新生数组b的关系,再对b数组进行分治后,如何运用b数组的值转变为a数组的下标,以至于得出数组a的合并范围。

【程序】

用java语言编写程序,代码如下:


public class NatureSort {
public static void main(String[] args) {
int[] a = {4, 9, 2, 6, 1, 5, 7, 3};

int[] b = new int[8];
int len = partition(a, 8, b);
/*for(int i = 0; i < len; i++)
System.out.println(b[i]);*/

natureSort(a, 8, b, len, 0, len - 1);

System.out.print(a[0]);
for(int i = 1; i < 8; i++)
System.out.print(" " + a[i]);
System.out.println();


}

public static int partition(int[] a, int n, int[] b) {
int len = 1;
b[0] = 0;
for(int i = 1; i < n; i++) {
if(a[i] < a[i - 1])
b[len++] = i;
}

return len;
}

public static void natureSort(int[] a, int n, int[] b, int len, int left, int right) {
if(right - left > 0) {
int mid = (left + right) / 2;
natureSort(a, n, b, len, left, mid);
natureSort(a, n, b, len, mid + 1, right);

int mleft, mmid, mright;
mleft = b[left];
mmid = b[mid + 1] - 1;
if(right + 1 < len)
mright = b[right + 1] - 1;
else
mright = n - 1;

merge(a, mleft, mmid, mright);
}
}

public static void merge(int[] a, int left, int mid, int right) {
int c1 = left, c2 = mid + 1;
int c = 0;
int[] work = new int[right - left + 1];
while(c1 <= mid && c2 <= right) {
if(a[c1] < a[c2])
work[c++] = a[c1++];
else
work[c++] = a[c2++];
}

while(c1 <= mid)
work[c++] = a[c1++];

while(c2 <= right)
work[c++] = a[c2++];

for(int i = left, j = 0; i <= right; i++, j++)
a[i] = work[j];
}
}

【结果】

自然排序_java_06

标签:right,int,自然,len,++,数组,排序,left
From: https://blog.51cto.com/u_15894233/5893620

相关文章

  • 堆排序算法
    堆排序算法堆排序定义:堆排序是将一组无序数组(二叉树)构建成一个堆,分为大顶堆和小顶堆大顶堆:父节点的值永远大于其左子树和右子树的值堆排序思路:将堆顶元素与末尾元......
  • Java数组排序
       今天,巩固教大家数组排序方法,我将介绍以下这几种方式:快速排序,冒泡排序,选择排序。1、快速排序这就是各位学Java的福利了,Java提供sort()方法,咱们只......
  • 07#Web 实战:实现 GitHub 个人主页项目拖拽排序
    实现效果图GitHub和Gitee个人主页中可以对自己的项目进行拖拽排序,于是我就想自己实现一个。本随笔只是记录一下大概的实现思路,如果感兴趣的小伙伴可以通过代码和本随......
  • lc第319场周赛第三题-逐层排序二叉树所需的最少操作数目
    给你一个值互不相同的二叉树的根节点root。在一步操作中,你可以选择同一层上任意两个节点,交换这两个节点的值。返回每一层按严格递增顺序排序所需的最少操作数目......
  • DRF过滤、排序、异常处理、自定义Response、分页
    DRF过滤、排序、异常处理、自定义Response、分页目录DRF过滤、排序、异常处理、自定义Response、分页过滤局部过滤排序异常处理封装Response对象分页三种分页方式PageNumb......
  • 拓端tecdat|适用于NLP自然语言处理的Python代写:使用Facebook FastText库
    适用于NLP自然语言处理的Python:使用FacebookFastText库 在本文中,我们将研究​​FastText​​,它是用于单词嵌入和文本分类的另一个极其有用的模块......
  • 1752. 检查数组是否经排序和轮转得到
    1752.检查数组是否经排序和轮转得到classSolution{publicbooleancheck(int[]nums){intn=nums.length;intx=0;for(inti=......
  • 冒泡排序、快速排序
    冒泡排序、快速排序都属于交换排序,快速排序对冒泡排序优化。冒泡排序 (1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较......
  • python 列表排序方法
    常见的列表排序方法参考:https://blog.csdn.net/m0_69265664/article/details/125703164iterable.sort()参考:https://blog.csdn.net/rhx_qiuzhi/article/details/1193025......
  • 力扣 leetcode 1752. 检查数组是否经排序和轮转得到
    问题描述给你一个数组nums。nums的源数组中,所有元素与nums相同,但按非递减顺序排列。如果nums能够由源数组轮转若干位置(包括0个位置)得到,则返回true;否则,返回fa......