two steps 发表于 2003-5-31 22:09

请问数组能这么用么, 我晕晕呼呼

merge 是以有的一个函数, 可将两个已经sortiete arrays 合并到一起, 返回的也是一个array,然后让编这个mergesort(int [] a),只许iterativ。

public static void mergesort(int[] a){
      int [] x1={a};
      int [] x2={a};
      int [] c = merge(x1, x2);
      int i=2;
      while (i<a.length){
            int [] b={a};
            int [] temp =merge(c,b);
            c=temp;
            i++;
      }
    }

我总觉得 c= temp那里比较别扭, 长度上,但又不知怎么该:(

文选流氓 发表于 2003-5-31 22:54

呵呵,不好意思,本想让你的源程序正常显示,所以编辑了一下你的主贴,可惜没成功:(

我没弄明白你为何那样声明x1,x2两个数组,对于整个程序来说,似乎没什么意义(我猜想你只是为了在声明c的时候可以使用一下merge这个方法)。至于在while循环里的这两句:
            int [] temp =merge(c,b);
            c=temp;
我觉得你可以用 c = merge(c,b);代替。整个程序改成这样怎么样?

public static void mergesort(int [] a)
{
       int c[] = new int;
       int i = 0;
      while( i < a.length)
      {
         int x = { a(i)};
         c = merge(c,x);
         i++;
       }
}


array的长度一旦确定,是无法更改的,用arrylist或者arry.add(i)方法要更方便一些。

two steps 发表于 2003-5-31 23:09

:D 谢谢, 给你鞠躬了。;)   再提一个问题成不? 什么叫shellsort?
谢谢你的建议用arraylist or array.add(i), 可惜我不懂:(

文选流氓 发表于 2003-6-1 00:59

不用客气:)

shellsort我不清楚:(。

事实上我刚才写的那几个句子,只是把a数组中的数据一个一个放进c数组里,跟sort是没什么关系的。用array.add()方法也可以实现:把while里的前两句替换成c.add(a);就行了,不需要x数组。

Array有自带一个sort方法:Arrays.sort(arrays)
具体用法你可以在Java API里查到:java.util.Arrays
[http://java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html

ArrayList到底是个什么东西我说不清楚,只知道它的长度是可以更改的,可以随意(同时)地放任何类型的数据进去。不过它跟你这个题目没什么关系,我也只是随口提了一句,呵呵。

musicbug 发表于 2003-6-1 01:14

Shellsort
   

Shellsort ist eines der am l&auml;ngsten bekannten Sortierverfahren (benannt nach seinem Urheber D.L. Shell ). Es ist sehr schnell, einfach zu verstehen und einfach zu implementieren, allerdings ist seine Analyse etwas aufwendiger.

http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/shell/shell.htm

文选流氓 发表于 2003-6-1 01:19

hmmm, 不错不错,谢谢:)

two steps 发表于 2003-6-1 12:52

wonderbar:D :D 现在正在讲各种sortiereverfahren....昨天贴的那是作业中的一道, 我不会:( 。
还有一个变态 sort 如下:
public static void magic (int [] a){
    int l, r, m, x;
    for ( int i=1; i<a.length; i++){
      x=a;
      l=0;
      r=i-1;
      while ( l<= r) {
            m= (l+r)/2;
            if (x<=a){r=m-1;}
            else {l=m+1;}
      }
      for (int j =i-1; j>=1; j--) {
            a = a;
      }
      a=x;   
   }
然后说:Wenden Sie den obigen Algorithmus "per Hand" auf das folgende Feld an : " 23, 17,46, 67, 19, 2, 11, 8 ".....(blablabla)
我老老实实的按着程序去折腾折腾这串数。。。对最后那个for-schleife 大惑不解:confused:能再帮帮我么? thanks for advance;)

musicbug 发表于 2003-6-1 13:20

你第一个for循环是什么?是不是写错?

two steps 发表于 2003-6-1 14:02

xixi...sorry:D 是打错了, 更正:
for (int i=1; i<a.length; i++){
      x=a;
      l=0;
...........:o

two steps 发表于 2003-6-1 14:04

for ( int i=1; i<a.length; i++){
    x= a;
    l= 0;

.......

musicbug 发表于 2003-6-1 14:12

was bedeutet das ???i x=a;
Hast du wieder vertippt?

two steps 发表于 2003-6-1 14:15

啊:mad:气气啦, 为甚么呀, 总传成这副德性:confused:
干脆口述吧: 就是for 一下,dann wird int i mit 1 inizializiert und je nach durchlaufen um 1 erhoeht bis es die laenge dieses arrays minus 1 erreicht.
im schleifeninneren :x= a; l=0;.......

musicbug 发表于 2003-6-1 14:36

bitte schreib mal den vollst&auml;ndige Code.

two steps 发表于 2003-6-1 16:48

public static void magic (int [] a){
    int l, r, m, x;
    for ( int i=1; i< a.length;){
       x=a;
       l=0;
       r=i-1;
       while ( l<= r) {
         m= (l+r)/2;
         if (x<=a){r=m-1;}
         else {l=m+1;}
       }
      for (int j =i-1; j>=1; j--) {
         a = a;
      }
      a=x;
}}

two steps 发表于 2003-6-1 16:50

我都没话了, 明明没打那个;) 嘛

two steps 发表于 2003-6-1 16:51

;)   change to    ;i++   )

musicbug 发表于 2003-6-1 17:44

最后那个for循环就是把所有的元素顺序移一次位,比如a=a,a=...
依次类推最后缺一个的数组也就是上面while循环里面比较出来最大的数组再补上。

two steps 发表于 2003-6-1 18:10

可它这么一移, 空缺的总是第一个位置呀?:confused: , 而while 里选出的那个位置 不一定是第一个呀

daxia108 发表于 2003-7-16 09:33

我想你最后一个for循环是抄错了,应该是

for (int j =i-l; j>=l; j--) {
a = a;
}

前面的while循环,是二分法比较,最后我们得到的是x在它的前位数组里的有效位置,这个位置最后是用l来表示的。那么之后的for循环做的功能就是把从l到i-1位置的元素向后顺移,然后空出l的位置给x。这种排序方法类似于插入排序,只是比较模块用了二分法。其实我感觉并不是很好,komplexzeit比不上快速排序和希尔排序。
页: [1]
查看完整版本: 请问数组能这么用么, 我晕晕呼呼