好好生活,努力工作,天天向上!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

             真的是越來越喜歡Scala了,簡潔的語法,清新的風(fēng)格是我對Scala的印象,感覺使用Scala進(jìn)行編程真的非常的方便,從Scala的設(shè)計思想也能得到不少的啟發(fā),就比如下面的一個對數(shù)字?jǐn)?shù)組快速排序的sort(Array[Int])方法,你以前想到過通過這樣的方式實現(xiàn)嗎?

          /**
           * 快速排序的例子2
           * 
          @author VWPOLO
           * <p>2009-8-12</p>
           
          */
          object TestQuickSort2 {
            def main(args : Array[String]) : Unit 
          = {
              var arrays 
          = Array(123,343,5435,23,3213);
              Console.println(
          "排序前的結(jié)果");
              arrays.foreach((array: Int ) 
          => println(array))
              arrays 
          = sort(arrays);
              Console.println(
          "排序后的結(jié)果");
              arrays.foreach((array: Int ) 
          => println(array))
            }
            
            def sort(xs: Array[Int]):Array[Int] 
          = {
              
          if(xs.length <= 1)
                xs;
              
          else {
                val pivot 
          = xs(xs.length /2);
                Array.concat(
                    sort(xs filter (pivot 
          >)),
                         xs filter (pivot 
          ==),
                    sort(xs filter (pivot 
          <))
                )
              }
            }
          }

              sort(Array[Int])方法通過簡明的方式完成了傳統(tǒng)的快速排序功能:

                1、判斷參數(shù)數(shù)組是否為空?如果為空說明排序完成,直接方法參數(shù)。

                2、如果給定的參數(shù)數(shù)字不為空,取得數(shù)組的中間數(shù)。

                3、根據(jù)中間數(shù)對參數(shù)數(shù)組進(jìn)行拆分,通過調(diào)用Arrayfilter(pA => Boolean)方法對數(shù)組進(jìn)行分區(qū)并生成一個新的數(shù)組,"xs filter (pivot >)生成一個新的數(shù)組只包含小于pivot的數(shù)字,"xs filter (pivot ==)"里面的數(shù)組只包含等于pivot的數(shù)組,"xs filter (pivot <)"則包含大于pivot的數(shù)字,通過sort方法的迭代,完成了排序過程。

                4、通過Array.concat方法合并多個數(shù)組,返回排序后的結(jié)果就行了


              sort方法指定了返回值但是方法塊中沒有"return" 語言,其實加不加都無所謂,Scala編譯器可以自動進(jìn)行判斷。

              這種方式和傳統(tǒng)的快速排序方法在時間復(fù)雜度和空間復(fù)雜度相似,但是代碼卻大大的簡化了,不信你用Java寫一個對數(shù)字?jǐn)?shù)組快速的排序方法(要自己寫,使用Collections.sort(List<T>)方法可不算啊)。

              Scala引起了大家的大量關(guān)注,一些人拿Scala的缺點和Java的優(yōu)點進(jìn)行比較進(jìn)行批評Scala"另一些人拿Java缺點和Scala優(yōu)點進(jìn)行比較來擁護(hù)Scala,然后兩隊人在論壇上打起了口水仗,Scala又不是鈔票,當(dāng)然不能夠取悅所有人。


              參考資料:Scala By Example
           

          posted on 2009-08-13 09:02 VWPOLO 閱讀(1603) 評論(6)  編輯  收藏 所屬分類: Java 技術(shù)

          Feedback

          # re: Scala 的快速排序 2009-08-13 10:19 Johnny Jian
          Console.println("排序前的結(jié)果");
          arrays.foreach((array: Int ) => println(array))

          =>

          println("排序前的結(jié)果")
          arrays.foreach(println)  回復(fù)  更多評論
            

          # re: Scala 的快速排序 2009-08-13 10:23 VWPOLO
          @Johnny Jian
          不錯,這樣更簡潔!  回復(fù)  更多評論
            

          # re: Scala 的快速排序[未登錄] 2009-08-13 11:20 dennis
          這里并不是scala的優(yōu)雅,而是遞歸的優(yōu)雅。scala的語法談不上優(yōu)美,反而是晦澀。  回復(fù)  更多評論
            

          # re: Scala 的快速排序 2009-08-14 00:40 Net4J
          不還覺得Groovy的順眼.  回復(fù)  更多評論
            

          # re: Scala 的快速排序 2009-08-14 22:44 Johnny Jian
          @Net4J
          贊成
          同樣的程序用Groovy寫:
          def sort(xs) {
          if (xs.size() <= 1)
          xs
          else {
          def pivot = xs[xs.size() / 2 as int]
          sort(xs.findAll { it < pivot }) +
          xs.findAll { it == pivot } +
          sort(xs.findAll { it > pivot })
          }
          }
          def array = [123, 343, 5435, 23, 3213]
          println array
          array = sort(array)
          println array

          或者用groupBy方法:
          def sort(xs) {
          if (!xs)
          []
          else {
          def pivot = xs[xs.size() / 2 as int]
          def m = xs.groupBy { it <=> pivot }
          sort(m[-1]) + m[0] + sort(m[1])
          }
          }
          def array = [123, 343, 5435, 23, 3213]
          println array
          array = sort(array)
          println array  回復(fù)  更多評論
            

          # re: Scala 的快速排序 2009-08-15 09:53 VWPOLO
          @Johnny Jian
          只能說蘿卜白菜,各有所愛了  回復(fù)  更多評論
            

          主站蜘蛛池模板: 南开区| 永兴县| 浦东新区| 廊坊市| 葵青区| 景东| 奉新县| 禄丰县| 马龙县| 左云县| 亳州市| 沂水县| 横峰县| 门头沟区| 龙胜| 恩平市| 海丰县| 葫芦岛市| 甘德县| 广东省| 云林县| 韶关市| 咸丰县| 阿尔山市| 双江| 富阳市| 县级市| 阳高县| 宿松县| 驻马店市| 江都市| 万宁市| 灵台县| 三江| 朝阳县| 通河县| 长乐市| 铜鼓县| 兴国县| 青浦区| 高碑店市|