数据结构归并排序java实现

思想:

假设初始序列右n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2向上取整 个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。在此基础上,在对长度为2的有序子序列进行两两归并,得到若干个长度为4的有序子序列。如此重复,直至得到一个长度为n的有序序列为止。

稳定性:稳定

时间复杂度计算:

  1. 数组的大小是2的幂,这样分下去始终可以被2整除。假设为2的k次方,即k=log2(n)。
  2. 每次我们选择的值刚好是中间值,这样,数组才可以被等分。
    第一层递归,需要循环n次才能排序好,第二层循环2*(n/2)......
    所以共有n+2(n/2)+4(n/4)+...+n*(n/n) = n+n+n+...+n=k*n=log2(n)*n
    所以算法复杂度为O(log2(n)*n) 。

代码:

 public static void sort(int[] data, int left, int right) {
  System.out.println(left+":"+right);
  if (left < right) {
   int center = (left + right) / 2;
   
   System.out.println(left+":"+center+":"+right);
   // 对左边数组进行递归
   sort(data, left, center);
   
   System.out.println(left+":"+center+":"+right);
   // 对右边数组进行递归
   sort(data, center + 1, right);
   
   // 合并
   merge(data, left, center, right);
  }
 }
 public static void merge(int[] data, int left, int center, int right) {
  int[] tmpArr = new int[data.length];
  int mid = center + 1;
  // third记录中间数组的索引
  int third = left;
  int tmp = left;
  while (left <= center && mid <= right) {
   // 从两个数组中取出最小的放入中间数组
   if (data[left] <= data[mid]) {
    tmpArr[third++] = data[left++];
   } else {
    tmpArr[third++] = data[mid++];
   }
  }
  // 剩余部分依次放入中间数组
  while (mid <= right) {
   tmpArr[third++] = data[mid++];
  }
  while (left <= center) {
   tmpArr[third++] = data[left++];
  }
  // 将中间数组中的内容复制回原数组
  while (tmp <= right) {
   data[tmp] = tmpArr[tmp++];
  }
  System.out.println(Arrays.toString(data));
 }
 
 public static void main(String[] args) {
  int[] a1 = {5,1,3,4,2};
  sort(a1,0,a1.length-1);
 }
时间: 2024-10-07 06:30:20

数据结构归并排序java实现的相关文章

数据结构 - 归并排序(merging sort)

归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort), 但是归并排序是稳定排序, 而快速排序和堆排序则不是. 代码: /* * main.cpp * *  Created on: 2014.6.12 *      Author: Spike */ /*eclipse cdt, gcc

数据结构 - 归并排序(merging sort) 详解 及 代码

归并排序(merging sort) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort), 但是归并排序是稳定排序, 而快速排序和堆排序则不是. 代码: /* * main.cpp

数据结构归并排序实现

package com.he.list; public class Collections { public static ArrayList mergeList(ArrayList l1, ArrayList l2) { ArrayList l = new ArrayList(); int l1_length = l1.getLength(); int l2_length = l2.getLength(); int i = 0; int j = 0; while (i < l1_length

数据结构(JAVA版本)练习之集合 简易图书管理系统

数据结构实用教程(JAVA版) 看完第一章  集合   结合书中代码 稍微修改做个小练习: 课程表类: package com.chujianyun.com; public class Table { private String key; private String rest; public Table() { } public Table(String key, String rest) { super(); this.key = key; this.rest = rest; } publ

数据结构在Java中的用法(持续更新...)

今天做了Medallia公司的Java面试题,发现用惯了C/C++之后对Java感到异常地不适应,特别是对数据结构在Java中如何使用感到十分头疼,于是开始整理并练习Java API里头关于数据结构的使用方法.甲骨文的Java API对每一种数据结构只提供解释但没有提供相关的例子,很不方便,因为大多数时候我们都是通过读例子来学习用法,这也是我学C++觉得最有用的方法. Vector 甲骨文API:"The Vector class implements a growable array of o

数据结构(Java语言)——HashTable(开放定址法)简单实现

分离链接散列算法的缺点是使用一些链表.由于给新单元分配地址需要时间,因此这就导致算法的速度有些减慢,同时算法实际上还要求对第二种数据结构的实现.另有一种不用链表解决冲突的方法是尝试另外一些单元,直到找出空的单元为止.更常见的是,单元h0(x),h1(x),h2(x),...相继被试选,其中hi(x)=(hash(x)+f(i)) mod TableSize,且f(0)=0.函数f是冲突解决方法,因为所有的数据都要置于表内,所以这种解决方案所需要的表要比分离链接散列的表大.一般来说,对于不使用分离

数据结构(Java语言)——Stack简单实现

栈是限制插入和删除仅仅能在一个位置上进行的表.该位置是表的末端,叫做栈的顶top.对栈的基本操作有进栈push和出栈pop,前者相当于插入.后者这是删除最后插入的元素. 栈有时又叫先进先出FIFO表. 因为栈操作是常数时间.因此除非在特殊情况下,栈不会产生明显改进. 栈的第一种实现方法是使用单链表.通过在表的顶端插入来实现push,通过删除表顶端元素实现pop.top操作仅仅是返回顶端元素的值.另外一种实现方法是使用数组,避免了链并且是更流行的解决方式.栈的栈顶用topOfStack来指向表示,

归并排序 求逆序数 链表的归并排序 多线程归并排序 java

import java.util.Scanner; public class Main { private static int count=0; public static void mergesort(int a[],int low,int high) { if(low<high) { int mid=(low+high)>>1; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } pri

【数据结构】java中LinkedList学习总结

一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效.但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差. 二.LinkedList类定义 public class LinkedList<E> extends AbstractSequentialList<