2 codingdoubleb CodingDoubleB 于 2014.12.04 13:56 提问

我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)

import java.util.Random;

public class MergeSort implements Runnable{

public void run()
{
    int[] a = new int[100000]; 
    Random p = new Random();    //产生随机数 
    for(int i=0;i<100000;i++)
        a[i] = p.nextInt(10000);
  //计时
  //long startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
  //System.out.println("总耗时为:"+(startMili)+"毫秒");
  mergeSort(a, 0, 1);  
  //long endMili=System.currentTimeMillis();
  //System.out.println("总耗时为:"+(endMili)+"毫秒");
  //System.out.println("\n总耗时为:"+(endMili-startMili)+"毫秒");
}
 // private static long sum = 0;  

 /** 
  * <pre> 
  * 二路归并 
  * 原理:将两个有序表合并和一个有序表 
  * </pre> 
  *  
  * @param a 
  * @param s 
  *            第一个有序表的起始下标 
  * @param m 
  *            第二个有序表的起始下标 
  * @param t 
  *            第二个有序表的结束下标 
  *  
  */  
 private static void merge(int[] a, int s, int m, int t) {  
  int[] tmp = new int[t - s + 1];  

  int i = s, j = m, k = 0;  
  while (i < m && j <= t) {  
   if (a[i] <= a[j]) {  
    tmp[k] = a[i];  
    k++;  
    i++;  
   } else {  
    tmp[k] = a[j];  
    // sum += (j - i) - (j - m);  
    j++;  
    k++;  
   }  
  }  
  while (i < m) {  
   tmp[k] = a[i];  
   i++;  
   k++;  
  }  

  while (j <= t) {  
   tmp[k] = a[j];  
   j++;  
   k++;  
  }  

  System.arraycopy(tmp, 0, a, s, tmp.length);  
 }  

 /** 
  *  
  * @param a 
  * @param s 
  * @param len 
  *            每次归并的有序集合的长度 
  */  
 public static void mergeSort(int[] a, int s, int len) {  

  int size = a.length;  
  int mid = size / (len << 1);  
  int c = size & ((len<<1) - 1);  

  // -------归并到只剩一个有序集合的时候结束算法-------//  
  if (mid == 0)  
   return;  

  // ------进行一趟归并排序-------//  
  for (int i = 0; i < mid; ++i) {  
   s = i * 2 * len;  
   merge(a, s, s + len, (len << 1) + s - 1);  
  }  

  // -------将剩下的数和倒数一个有序集合归并-------//  
  if (c != 0)  
   merge(a, size - c - 2 * len, size - c, size - 1);  
  //  
  // for (int i = 0; i < a.length; ++i) {  
  // System.out.print(a[i] + " ");  
  // }  
  // System.out.println();  

  // -------递归执行下一趟归并排序------//  
  mergeSort(a, 0, 2 * len);  
 }  

 public static void main(String[] args) throws InterruptedException {  
    Thread m = new Thread(new MergeSort());
    Thread m1 = new Thread(m);
    Thread m2 = new Thread(m);
    Thread m3 = new Thread(m);
    Thread m4 = new Thread(m);
    Thread m5 = new Thread(m);

    //计时
      long startMili1=System.currentTimeMillis();// 当前时间对应的毫秒数
      System.out.println("总耗时为:"+(startMili1)+"毫秒");
      m1.start();
      m1.join();
      long endMili1=System.currentTimeMillis();
      System.out.println("总耗时为:"+(endMili1)+"毫秒");
      System.out.println("总耗时为:"+(endMili1-startMili1)+"毫秒\n");

      long startMili2=System.currentTimeMillis();// 当前时间对应的毫秒数
      System.out.println("总耗时为:"+(startMili2)+"毫秒");
      m2.start();
      //m2.join();
      m3.start();
      //m3.join();
      m4.start();
      //m4.join();
      m5.start();
      //m5.join();
      long endMili2=System.currentTimeMillis();
      System.out.println("总耗时为:"+(endMili2)+"毫秒");
      System.out.println("总耗时为:"+(endMili2-startMili2)+"毫秒");
 }  

}  

2个回答

u012113075
u012113075   2014.12.04 17:30

什么对象??new和delete是成对出现的

CodingDoubleB
CodingDoubleB 你的意思是,对对象进行清除?我刚入手,不懂,还望您多指点
3 年多之前 回复
CodingDoubleB
CodingDoubleB 你的意思是,对对象进行清除?我刚入手,不懂,还望您多指点
3 年多之前 回复
eagleyan
eagleyan   Rxr 2014.12.05 00:24

我猜你想问的是这些线程是否对同一个数组进行排序,答案是不是,是不同的数组。

你可能又会问,为什么每个线程我看到了相同的结果,我不是使用随机数么。答案是你使用的是伪随机数,你每个线程里都是用的是Random,没有使用不同的种子(seed),所以产生出来的是相同的数据。正确的做法:
1. JDK7及以上,用ThreadLocalRandom代替Random
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadLocalRandom.html
2. JDK7以下,使用不同的seed(申明一下,这种方法仍然可能产生重复的种子)
new Random(System.currentMillis());

CodingDoubleB
CodingDoubleB 楼上勿看,按错了-------------如果对同一个数组,采取多线程的分段排序,使之效率提高,有没有什么好的方法?(除了之前就直接对已知长度数组的长度进行有效地划分,来排序之外)
3 年多之前 回复
CodingDoubleB
CodingDoubleB 楼上勿看,按错了-------------如果对同一个数组,采取多线程的分段排序,使之效率提高,有没有什么好的方法?(除了之前就直接对已知长度数组的长度进行有效地划分,来排序之外)
3 年多之前 回复
CodingDoubleB
CodingDoubleB 我如果对同一个数组,采用多项承德市、方式
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!