知识大全 自己编写的Java数组操作工具

Posted 元素

篇首语:如果梦想有捷径的话,那么这条路的名字一定叫坚持。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 自己编写的Java数组操作工具相关的知识,希望对你有一定的参考价值。

自己编写的Java数组操作工具  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  看到网上的一段关于对数组操作的代码 觉得有用 在此备用 [java]

  import java util ArrayList;

  import java util Arrays;

  import java util List;

  import java util Map;

  import java util Random;

  import java util TreeMap;

  /**

  * @desc 数组操作工具

  * @author OuyangPeng

  * @datatime : :

  *

  */

  public class MyArrayUtils

  /**

  * 排序算法的分类如下 插入排序(直接插入排序 折半插入排序 希尔排序); 交换排序(冒泡泡排序 快速排序);

  * 选择排序(直接选择排序 堆排序); 归并排序; 基数排序

  *

  * 关于排序方法的选择 ( )若n较小(如n≤ ) 可采用直接插入或直接选择排序

  * ( )若文件初始状态基本有序(指正序) 则应选用直接插人 冒泡或随机的快速排序为宜;

  * ( )若n较大 则应采用时间复杂度为O(nlgn)的排序方法 快速排序 堆排序或归并排序

  *

  */

  /**

  * 交换数组中两元素

  *

  * @since

  * @param ints

  * 需要进行交换操作的数组

  * @param x

  * 数组中的位置

  * @param y

  * 数组中的位置

  * @return 交换后的数组

  */

  public static int[] swap(int[] ints int x int y)

  int temp = ints[x];

  ints[x] = ints[y];

  ints[y] = temp;

  return ints;

  

  /**

  * 冒泡排序方法:相邻两元素进行比较 性能 比较次数O(n^ ) n^ / ;交换次数O(n^ ) n^ /

  * 冒泡排序(Bubble Sort)是一种简单的排序算法 它重复地走访过要排序的数列 一次比较两个元素

  * 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换

  * 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经由交换慢慢 浮 到数列的顶端

  冒泡排序算法的运作如下:

   比较相邻的元素 如果第一个比第二个大 就交换他们两个

   对每一对相邻元素作同样的工作 从开始第一对到结尾的最后一对 在这一点 最后的元素应该会是最大的数

   针对所有的元素重复以上的步骤 除了最后一个

   持续每次对越来越少的元素重复上面的步骤 直到没有任何一对数字需要比较

  * @since

  * @param source

  * 需要进行排序操作的数组

  * @return 排序后的数组

  */

  public static int[] bubbleSort(int[] source)

  /*for (int i = ; i < source length ; i++) // 最多做n 趟排序

  for (int j = ; j < source length i ; j++) // 对当前无序区间score[ length i ]进行排序(j的范围很关键 这个范围是在逐步缩小的)

  if (source[j] > source[j + ]) // 把大的值交换到后面

  swap(source j j + );

  

  

  */

  for (int i = source length ; i> ; i )

  for (int j = ; j < i; j++)

  if (source[j] > source[j + ])

  swap(source j j + );

  

  

  

  return source;

  

  /**

  * 选择排序法 方法 选择排序(Selection sort)是一种简单直观的排序算法 其平均时间复杂度为O(n )

  * 它的工作原理如下 首先在未排序序列中找到最小元素 存放到排序序列的起始位置 然后

  * 再从剩余未排序元素中继续寻找最小元素 然后放到排序序列末尾 以此类推 直到所有元素均排序完毕

  * 性能 选择排序的交换操作介于 和(n )次之间 选择排序的比较操作为n(n )/ 次之间

  * 选择排序的赋值操作介于 和 (n )次之间 其平均时间复杂度为O(n )

  * 交换次数比冒泡排序少多了 由于交换所需CPU时间比比较所需的CUP时间多 所以选择排序比冒泡排序快

  * 但是N比较大时 比较所需的CPU时间占主要地位 所以这时的性能和冒泡排序差不太多 但毫无疑问肯定要快些

  *

  * @since

  * @param source

  * 需要进行排序操作的数组

  * @return 排序后的数组

  */

  public static int[] selectSort(int[] source)

  for (int i = ; i < source length; i++)

  for (int j = i + ; j < source length; j++)

  if (source[i] > source[j])

  swap(source i j);

  

  

  

  return source;

  

  /**

  * 插入排序 方法 将一个记录插入到已排好序的有序表(有可能是空表)中 从而得到一个新的记录数增 的有序表 性能 比较次数O(n^ ) n^ /

  * 复制次数O(n) n^ / 比较次数是前两者的一般 而复制所需的CPU时间较交换少 所以性能上比冒泡排序提高一倍多 而比选择排序也要快

  *

  * @since

  * @param source

  * 需要进行排序操作的数组

  * @return 排序后的数组

  */

  public static int[] insertSort(int[] source)

  for (int i = ; i < source length; i++)

  for (int j = i; (j > ) && (source[j] < source[j ]); j )

  swap(source j j );

  

  

  return source;

  

  /**

  * 快速排序 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub lists) 步骤为

  * 从数列中挑出一个元素 称为 基准 (pivot)

  * 重新排序数列 所有元素比基准值小的摆放在基准前面 所有元素比基准值大的摆在基准的后面

  * (相同的数可以到任一边) 在这个分割之后 该基准是它的最后位置 这个称为分割(partition)操作

  * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

  * 递回的最底部情形 是数列的大小是零或一 也就是永远都已经被排序好了

  * 虽然一直递回下去 但是这个算法总会结束 因为在每次的迭代(iteration)中 它至少会把一个元素摆到它最后的位置去

  *

  * @since

  * @param source

  * 需要进行排序操作的数组

  * @return 排序后的数组

  */

  public static int[] quickSort(int[] source)

  return qsort(source source length );

  

  /**

  * 快速排序的具体实现 排正序

  *

  * @since

  * @param source

  * 需要进行排序操作的数组

  * @param low

  * 开始低位

  * @param high

  * 结束高位

  * @return 排序后的数组

  */

  private static int[] qsort(int source[] int low int high)

  int i j x;

  if (low < high)

  i = low;

  j = high;

  x = source[i];

  while (i < j)

  while (i < j && source[j] > x)

  j ;

  

  if (i < j)

  source[i] = source[j];

  i++;

  

  while (i < j && source[i] < x)

  i++;

  

  if (i < j)

  source[j] = source[i];

  j ;

  

  

  source[i] = x;

  qsort(source low i );

  qsort(source i + high);

  

  return source;

  

  // /////////////////////////////////////////////

  // 排序算法结束

  // ////////////////////////////////////////////

  /**

  * 二分法查找 查找线性表必须是有序列表

  *

  * @since

  * @param source

  * 需要进行查找操作的数组

  * @return 需要查找的值在数组中的位置 若未查到则返回

  */

  public static int[] binarySearch(int[] source)

  int i j;

  int low high mid;

  int temp;

  for (i = ; i < source length; i++)

  temp=source[i];

  low= ;

  high=i ;

  while (low <= high)

  mid = (low + high)/ ;

  if (source[mid]>temp)

  high=mid ;

   else

  low = mid + ;

  

  

  for (j= i ; j>high;j )

  source[j+ ]=source[j];

  source[high+ ]=temp;

  

  return source;

  

  /**

  * 反转数组

  *

  * @since

  * @param source

  * 需要进行反转操作的数组

  * @return 反转后的数组

  */

  public static int[] reverse(int[] source)

  int length = source length;

  int temp = ;

  for (int i = ; i < length >> ; i++)

  temp = source[i];

  source[i] = source[length i];

  source[length i] = temp;

  

  return source;

  

  /**

  * 在当前位置插入一个元素 数组中原有元素向后移动; 如果插入位置超出原数组 则抛IllegalArgumentException异常

  *

  * @param array

  * @param index

  * @param insertNumber

  * @return

  */

  public static int[] insert(int[] array int index int insertNumber)

  if (array == null || array length == )

  throw new IllegalArgumentException();

  

  if (index > array length || index <= )

  throw new IllegalArgumentException();

  

  int[] dest = new int[array length + ];

  System arraycopy(array dest index );

  dest[index ] = insertNumber;

  System arraycopy(array index dest index dest length index);

  return dest;

  

  /**

  * 整形数组中特定位置删除掉一个元素 数组中原有元素向前移动; 如果插入位置超出原数组 则抛IllegalArgumentException异常

  *

  * @param array

  * @param index

  * @return

  */

  public static int[] remove(int[] array int index)

  if (array == null || array length == )

  throw new IllegalArgumentException();

  

  if (index > array length || index <= )

  throw new IllegalArgumentException();

  

  int[] dest = new int[array length ];

  System arraycopy(array dest index );

  System arraycopy(array index dest index array length index);

  return dest;

  

  /**

  * 个数组合并 形成一个新的数组

  *

  * @param array

  * @param array

  * @return

  */

  public static int[] merge(int[] array int[] array )

  int[] dest = new int[array length + array length];

  System arraycopy(array dest array length);

  System arraycopy(array dest array length array length);

  return dest;

  

  /**

  * 数组中有n个数据 要将它们顺序循环向后移动k位 即前面的元素向后移动k位 后面的元素则循环向前移k位

  * 例如 循环移动 位后为

  *

  * @param array

  * @param offset

  * @return

  */

  public static int[] offsetArray(int[] array int offset)

  int length = array length;

  int moveLength = length offset;

  int[] temp = pyOfRange(array moveLength length);

  System arraycopy(array array offset moveLength);

  System arraycopy(temp array offset);

  return array;

  

  /**

  * 随机打乱一个数组

  *

  * @param list

  * @return

  */

  public static List shuffle(List list)

  java util Collections shuffle(list);

  return list;

  

  /**

  * 随机打乱一个数组

  *

  * @param array

  * @return

  */

  public int[] shuffle(int[] array)

  Random random = new Random();

  for (int index = array length ; index >= ; index )

  // 从 到index处之间随机取一个值 跟index处的元素交换

  exchange(array random nextInt(index + ) index);

  

  return array;

  

  // 交换位置

  private void exchange(int[] array int p int p )

  int temp = array[p ];

  array[p ] = array[p ];

  array[p ] = temp;

  

  /**

  * 对两个有序数组进行合并 并将重复的数字将其去掉

  *

  * @param a

  * 已排好序的数组a

  * @param b

  * 已排好序的数组b

  * @return 合并后的排序数组

  */

  private static List mergeByList(int[] a int[] b)

  // 用于返回的新数组 长度可能不为a b数组之和 因为可能有重复的数字需要去掉

  List c = new ArrayList();

  // a数组下标

  int aIndex = ;

  // b数组下标

  int bIndex = ;

  // 对a b两数组的值进行比较 并将小的值加到c 并将该数组下标+

  // 如果相等 则将其任意一个加到c 两数组下标均+

  // 如果下标超出该数组长度 则退出循环

  while (true)

  if (aIndex > a length || bIndex > b length )

  break;

  

  if (a[aIndex] < b[bIndex])

  c add(a[aIndex]);

  aIndex++;

   else if (a[aIndex] > b[bIndex])

  c add(b[bIndex]);

  bIndex++;

   else

  c add(a[aIndex]);

  aIndex++;

  bIndex++;

  

  

  // 将没有超出数组下标的数组其余全部加到数组c中

  // 如果a数组还有数字没有处理

  if (aIndex <= a length )

  for (int i = aIndex; i <= a length ; i++)

  c add(a[i]);

  

  // 如果b数组中还有数字没有处理

   else if (bIndex <= b length )

  for (int i = bIndex; i <= b length ; i++)

  c add(b[i]);

  

  

  return c;

  

  /**

  * 对两个有序数组进行合并 并将重复的数字将其去掉

  *

  * @param a

  * :已排好序的数组a

  * @param b

  * :已排好序的数组b

  * @return合并后的排序数组 返回数组的长度=a length + b length 不足部分补

  */

  private static int[] mergeByArray(int[] a int[] b)

  int[] c = new int[a length + b length];

  int i = j = k = ;

  while (i < a length && j < b length)

  if (a[i] <= b[j])

  if (a[i] == b[j])

  j++;

   else

  c[k] = a[i];

  i++;

  k++;

  

   else

  c[k] = b[j];

  j++;

  k++;

  

  

  while (i < a length)

  c[k] = a[i];

  k++;

  i++;

  

  while (j < b length)

  c[k] = b[j];

  j++;

  k++;

  

  return c;

  

  /**

  * 对两个有序数组进行合并 并将重复的数字将其去掉

  *

  * @param a

  * 可以是没有排序的数组

  * @param b

  * 可以是没有排序的数组

  * @return合并后的排序数组 打印时可以这样 Map map=sortByTreeMap(a b);

  * Iterator iterator = map entrySet(erator(); while

  * (iterator hasNext()) Map Entry mapentry =

  * (Map Entry)iterator next();

  * System out print(mapentry getValue()+ );

  */

  private static Map mergeByTreeMap(int[] a int[] b)

  Map map = new TreeMap();

  for (int i = ; i < a length; i++)

  map put(a[i] a[i]);

  

  for (int i = ; i < b length; i++)

  map put(b[i] b[i]);

  

  return map;

  

  /**

  * 在控制台打印数组 之间用逗号隔开 调试时用

  *

  * @param array

  */

  public static String print(int[] array)

  StringBuffer sb = new StringBuffer();

  for (int i = ; i < array length; i++)

  sb append( + array[i]);

  

  System out println( \\n +sb toString() substring( ));

  return sb toString() substring( );

  

cha138/Article/program/Java/hx/201311/26760

相关参考

知识大全 Java 删除数组中重复的元素

Java删除数组中重复的元素  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我是将数组封装为类的

知识大全 Java中数组的返回

Java中数组的返回  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  假定我们现在想写一个方法同时

知识大全 Java中数组的转型和范型

Java中数组的转型和范型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天写代码遇到一个奇怪

知识大全 怎样用Jvm处理Java数组

怎样用Jvm处理Java数组  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  记得vamcily曾

知识大全 Java静态与动态数组特点分析

Java静态与动态数组特点分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  平常我们接触到的大

知识大全 分析Java集合框架及数组的排序

分析Java集合框架及数组的排序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 使用Java编写的B*算法

使用Java编写的B*算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用Java编写的B*

知识大全 java读取文件内容写入到byte数组中

  有时候我们需要将读取文件的内容到一个byte[]数组中然后对这个数组进行一些修改这时我们可以借助于ByteArrayOutputStream这个类来实现  ByteArrayOutputStrea

知识大全 Java进阶:Java编写通过代理访问的应用程序

Java进阶:Java编写通过代理访问的应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 SQL Server编写存储过程小工具

SQLServer编写存储过程小工具  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在开发数据库