自然排序
来源:互联网 发布:盛世蠃家炒软件手机版 编辑:程序博客网 时间:2024/04/28 14:38
自然排序
如果数组中部分元素已按自然数顺序排放,例如,数组,则初期自然排好序的子数组段显然有4段,分别为,,和。请充分利用上述特点设计并实现一个自然合并排序算法,并分析该算法的计算时间复杂度。
【分析】
我们先是线性扫描,将数组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;elsemright = 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++];elsework[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];}}【结果】
0 0
- 自然排序
- 集合排序--自然排序
- 自然排序算法介绍
- TreeSet自然排序
- 自然合并排序算法
- 自然数组的排序
- 算法-自然合并排序
- TreeSet------自然排序
- 字符串自然排序
- JAVA自然排序
- 合并自然排序
- 自然合并排序
- Java自然排序
- Comparable(自然排序)
- 自然排序和强排序
- 自然排序和自定义排序
- 定制排序与自然排序
- PHP数组的“自然”排序
- 研发流程中的产品测试
- Spinners
- UVa 514 数据结构栈
- 【erlang 002】erlang中的错误及异常处理
- node.js 前后台传值的问题
- 自然排序
- 用U盘装CentOS把引导写在U盘上的同学们有救了!试试我的方法。
- RT_Thread下的LWIP传递机制
- 第二章—5
- UITextField && UITextView 限制限制字数做法
- POJ 3280(区间dp)
- cell自动换行
- org.apache.jasper.JasperException: Unable to compile class for JSP(可能情况)
- 0143895吴彬第一次c++作业